我有一个编辑器模板,其作用是将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
元素被赋予了复合名称而不是我提供的确切名称?
答案 0 :(得分:1)
我一直在努力应对MVC下拉 - 它只是行动不对。所以,我只是在我的模型数据上使用foreach滚动我自己的html。对于您来说这可能不是一个可接受的解决方法,但MVC是有目的的灵活性。
答案 1 :(得分:1)
免责声明:我不确定这是否完全安全,不会破坏任何东西。
但我遇到了完全相同的情况。但是,一旦我设定
ViewData.TemplateInfo.HtmlFieldPrefix = String.Empty
,
问题消失了。此行为似乎是在自定义模板中设计的 - 例如,请查看ViewData.TemplateInfo.GetFullHtmlFieldName
。