指定下拉列表asp.net mvc3 razor的名称

时间:2011-07-06 17:35:55

标签: asp.net asp.net-mvc-3 razor

我想知道为什么以下代码:

@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被父视图的视图模型覆盖。 (这是局部视图)。这对任何人都有意义吗?

1 个答案:

答案 0 :(得分: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)
{
    ...
}