为什么Html.DropDownList()产生<select name =“original_name.name”>而不仅仅是</select>?

时间:2010-02-18 02:37:27

标签: html asp.net-mvc asp.net-mvc-2 extension-methods

我有一个编辑器模板,其作用是将SelectList作为其模型,并使用select辅助扩展名在html中构建Html.DropDownList()元素。

我正在尝试根据name属性为select分配ModelMetadata属性。 (原因:在回发后,我需要绑定到一个对象,该对象具有与用于填充表单的ViewModel不同的属性名称。)

我遇到的问题是DropDownList() 追加我提供的名称而不是替换它,所以我最终得到了名字比如categories.category而不是category

以下是一些代码供您查看......

SelectList.ascx

<%@ Control Language="C#"
    Inherits="System.Web.Mvc.ViewUserControl<System.Web.Mvc.SelectList>" %>
<%= Html.DropDownList(
    (string)ViewData.ModelMetadata.AdditionalValues["PropertyName"], Model) %>

结果HTML

<select id="SkillLevels_SkillLevel" name="SkillLevels.SkillLevel">
    <option value="1">High</option>
    <option value="2">Med</option>
    <option selected="selected" value="3">Low</option>
</select>

预期的HTML

<select id="SkillLevels_SkillLevel" name="SkillLevel">
    <option value="1">High</option>
    <option value="2">Med</option>
    <option selected="selected" value="3">Low</option>
</select>

也尝试了

<%= Html.Encode((string)ViewData.ModelMetadata.AdditionalValues["PropertyName"])%>

...导致“SkillLevel”(而非“SkillLevels.SkillLevel”),证明存储在元数据中的数据是正确的。

<%= Html.DropDownList(
    (string)ViewData.ModelMetadata.AdditionalValues["PropertyName"], Model,
    new { name = (string)ViewData.ModelMetadata.AdditionalValues["PropertyName"] }) %>

...仍然导致<select name=SkillLevels.Skilllevel>

问题

这里发生了什么?为什么它会附加名称而不是仅使用它?你能建议一个好的解决方法吗?

更新

我最终编写了一个帮助扩展,它在html文本上执行查找/替换:

public static MvcHtmlString BindableDropDownListForModel(this HtmlHelper helper)
{
    var propertyName = (string)helper.ViewData.ModelMetadata.AdditionalValues["PropertyName"];
    var compositeName = helper.ViewData.ModelMetadata.PropertyName + "." + propertyName;
    var rawHtml = helper.DropDownList(propertyName, (SelectList)helper.ViewData.Model);
    var bindableHtml = rawHtml.ToString().Replace(compositeName, propertyName);
    return MvcHtmlString.Create(bindableHtml);
}

&gt;&gt;&gt; 我仍然想了解为什么这种解决方法是必要的。为什么select元素被赋予了复合名称而不是我提供的确切名称?

2 个答案:

答案 0 :(得分:1)

我一直在努力应对MVC下拉 - 它只是行动不对。所以,我只是在我的模型数据上使用foreach滚动我自己的html。对于您来说这可能不是一个可接受的解决方法,但MVC是有目的的灵活性。

答案 1 :(得分:1)

免责声明:我不确定这是否完全安全,不会破坏任何东西。 但我遇到了完全相同的情况。但是,一旦我设定 ViewData.TemplateInfo.HtmlFieldPrefix = String.Empty , 问题消失了。此行为似乎是在自定义模板中设计的 - 例如,请查看ViewData.TemplateInfo.GetFullHtmlFieldName