城堡单轨复杂装订

时间:2012-01-25 11:18:36

标签: c# castle-monorail nvelocity

我有这个ViewModel

class ProductViewModel{
List<ProductSellingScopeViewModel> Scopes{get;set;}
string Name{get;set;}
int Id{get;set;}
}


class ProductSellingScopeViewModel{
int IdScope{get;set;}
decimal Price{get;set;}
}

 class SellingScopeViewModel{
    int Id{get;set;}
    string Name{get;set;}
    }

为了创建/更新产品,我将为每个SellingScopeViewModel设置一个复选框(例如“网站”,“目录”......),用户将选择他想要销售产品的范围,对于每个范围,他都会写一个价格。

我试过这个(只有价格部分)(NVelocity):

#set($checkBoxList = $FormHelper.CreateCheckboxList("product.Scopes", $Scopes,"%{text='Name',value='Id',sourceProperty='IdScope'}"))
            #foreach($elem in $checkBoxList) 
$checkBoxList.Item("$elem.Id") $Form.LabelFor("$elem.Id",$elem.Name)
            #end

#foreach($aScope in $Scopes) 
$FormHelper.LabelFor("product.Scopes[$velocityCount].Price","$aScope.Name")
$FormHelper.TextField("product.Scopes[$velocityCount].Price")
$FormHelper.HiddenField("product.Scopes[$velocityCount].IdScope")
#end

创建产品没有问题。

但是为了更新产品,因为$ product.Scopes与$ Scopes的顺序不同,或者$ product.Scopes可能没有与每个范围链接。所以我最终会以

结束
Catalogue : |20$|
Call Center : |25$|
Web site : ||

如果我的对象是这样的

$ Scopes:

Id - Name
---------
1 - Catalogue
2 - Call Center
3 - Web Site

和Product.Scopes

IdScope - Price
--------------
3 - 20$
1 - 25$

我想到将ProductViewModel.Scopes更改为Dictionnary(并使用范围ID而不是$ velocityCount),但我不确定框架将如何反应。 或者不使用框架来显示价格值并处理帮助,但这有点与框架作斗争。

您怎么看?

编辑:如果我尝试使用我的Dictionnary创建一个复选框列表,Castle Monorail的FormHelper会抛出异常......

1 个答案:

答案 0 :(得分:0)

我不确定我是否遇到了您的问题,但为什么这两个循环,您可以将价格信息放在打印复选框的循环中:

           #set($checkBoxList = $FormHelper.CreateCheckboxList("product.Scopes", $Scopes,"%{text='Name',value='Id',sourceProperty='IdScope'}"))
            #foreach($elem in $checkBoxList) 
               $checkBoxList.Item("$elem.Id") $Form.LabelFor("$elem.Id",$elem.Name)
               $FormHelper.LabelFor("product.Scopes[$velocityCount].Price")
               $FormHelper.TextField("product.Scopes[$velocityCount].Price")
               $FormHelper.HiddenField("product.Scopes[$velocityCount].IdScope")
            #end