2011-07-06 76 views
0

的名字,我很奇怪,为什么下面的代码:指定下拉列表asp.net MVC3剃刀

@Html.DropDownList("Classification.Nationality.NationalityId", Model.Nationalities, new { @size = 10, @style = "display:none;", @class = "pickList" }) 

产生以下HTML,具体为什么元素的名称不是“Classification.Nationality.NationalityId”。

<select style="display: none;" size="10" name="CollectionCategory.Classification.Nationality.NationalityId" id="CollectionCategory_Classification_Nationality_NationalityId" class="pickList"> 

在函数签名肯定是这样的:

public static MvcHtmlString DropDownList(this HtmlHelper htmlHelper, string name, IEnumerable<SelectListItem> selectList, object htmlAttributes); 

好像通过视图的父视图的模型重写的名称参数GOTS。 (这是部分视图)。这对任何人都有意义吗?

回答

0

这是因为您在编辑器模板内部调用此帮助器,或者部分调用CollectionCategory导航属性。这是非常正常的行为,并确保在绑定时将适当的值发送给控制器操作。另外我想用这个帮手的强类型版本,以避免那些重构不友好魔术字符串建议您:

@Html.DropDownListFor(
    x => x.Classification.Nationality.NationalityId, 
    Model.Nationalities, 
    new { 
     @size = 10, 
     @style = "display:none;", 
     @class = "pickList" 
    } 
) 

当然,如果你不想遵循约定(不知道你为什么不),但你可以在您的POST操作中指定绑定前缀:

[HttpPost] 
public ActionResult Foo([Bind(Prefix = "CollectionCategory")] ClassificationViewModel model) 
{ 
    ... 
} 
+0

我已经开始沿着这些路线。问题在于,这是一个具有JavaScript功能的重用组件,因此组件的ID对客户端脚本非常重要。我想可以在视图模型上有一个属性,比如“ModelPrefix”或其他的东西来处理这个问题。你已经回答了我的问题,为什么会发生这种情况。谢谢。 – voam