为什么Html.DropDownList()产生而不是?
我有一个编辑器模板,其作业是将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
元素得到一个复合名称而不是我提供的确切名称?
我一直在努力与MVC下拉 - 它只是不正确的行为。所以,我只是在我的模型数据上使用foreach来展示我自己的html。这对你来说可能不是一个可以接受的解决方法,但MVC的目的是灵活的。
声明:我不确定这是否完全安全,不会破坏任何内容。 但我面临着完全相同的情况。但是,一旦我设置 ViewData.TemplateInfo.HtmlFieldPrefix = String.Empty
, 问题就消失了。这种行为似乎是自定义模板中的设计 - 例如,看看ViewData.TemplateInfo.GetFullHtmlFieldName
。
是的,这很烦人。 DropDown支持和模板是MVC中真正可以改进的两件事情。 – UpTheCreek 2011-04-13 12:16:28