我有一个编辑器模板,它的工作是以SelectList作为其模型,并使用Html.DropDownList()助手扩展在Html.DropDownList()中构建一个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) %>生成的
<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>期望的
<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"])%>...which导致了"SkillLevel“(而不是"SkillLevels.SkillLevel"),证明了元数据中存储的数据是正确的。
和
<%= Html.DropDownList(
(string)ViewData.ModelMetadata.AdditionalValues["PropertyName"], Model,
new { name = (string)ViewData.ModelMetadata.AdditionalValues["PropertyName"] }) %>...which仍可导致<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元素分配一个复合名称,而不是我提供的确切名称?
发布于 2010-02-19 01:07:36
我一直在与MVC的跌落作斗争--它只是表现得不对。所以,我只是在我的模型数据上加上了我自己的html。这对您来说可能不是一个可以接受的解决方案,但是MVC在目标上是灵活的。
发布于 2010-07-12 22:57:50
免责声明:我不确定这是否完全安全,不会破坏任何东西。但我也面临着同样的情况。然而,一旦我设置了ViewData.TemplateInfo.HtmlFieldPrefix = String.Empty,问题就消失了。这种行为似乎是在定制模板内部设计的--例如,查看一下ViewData.TemplateInfo.GetFullHtmlFieldName。
https://stackoverflow.com/questions/2285924
复制相似问题