2010-02-18 85 views
1

我有一个编辑器模板,其作业是将SelectList作为其模型,并使用Html.DropDownList()助手扩展在html中构建select元素。为什么Html.DropDownList()产生<select name =“original_name.name”>而不是<select name =“name”>?

我想根据ModelMetadata属性为select分配name属性。 (原因:在回发后,我需要绑定到与此项目具有不同属性名称的对象,而不是用于填充表单的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); 
} 

>>>我还是想了解为什么这种解决方法是必要的。为什么select元素得到一个复合名称而不是我提供的确切名称?

+0

是的,这很烦人。 DropDown支持和模板是MVC中真正可以改进的两件事情。 – UpTheCreek 2011-04-13 12:16:28

回答

1

我一直在努力与MVC下拉 - 它只是不正确的行为。所以,我只是在我的模型数据上使用foreach来展示我自己的html。这对你来说可能不是一个可以接受的解决方法,但MVC的目的是灵活的。

1

声明:我不确定这是否完全安全,不会破坏任何内容。 但我面临着完全相同的情况。但是,一旦我设置 ViewData.TemplateInfo.HtmlFieldPrefix = String.Empty, 问题就消失了。这种行为似乎是自定义模板中的设计 - 例如,看看ViewData.TemplateInfo.GetFullHtmlFieldName

相关问题