首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Html.DropDownList()会产生<select name="original_name.name">而不是只生成<select name="name">?

为什么Html.DropDownList()会产生<select name="original_name.name">而不是只生成<select name="name">?
EN

Stack Overflow用户
提问于 2010-02-18 02:37:26
回答 2查看 1.3K关注 0票数 1

我有一个编辑器模板,它的工作是以SelectList作为其模型,并使用Html.DropDownList()助手扩展在Html.DropDownList()中构建一个Html.DropDownList()元素。

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

我遇到的问题是,DropDownList()正在追加我提供的名称,而不是替换它,所以我最终使用的是像categories.category这样的名称而不是category

这是给你看的代码..。

SelectList.ascx

代码语言:javascript
复制
<%@ Control Language="C#"
    Inherits="System.Web.Mvc.ViewUserControl<System.Web.Mvc.SelectList>" %>
<%= Html.DropDownList(
    (string)ViewData.ModelMetadata.AdditionalValues["PropertyName"], Model) %>

生成的

代码语言:javascript
复制
<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>

期望的

代码语言:javascript
复制
<select id="SkillLevels_SkillLevel" name="SkillLevel">
    <option value="1">High</option>
    <option value="2">Med</option>
    <option selected="selected" value="3">Low</option>
</select>

也尝试过

代码语言:javascript
复制
<%= Html.Encode((string)ViewData.ModelMetadata.AdditionalValues["PropertyName"])%>

...which导致了"SkillLevel“(而不是"SkillLevels.SkillLevel"),证明了元数据中存储的数据是正确的。

代码语言:javascript
复制
<%= Html.DropDownList(
    (string)ViewData.ModelMetadata.AdditionalValues["PropertyName"], Model,
    new { name = (string)ViewData.ModelMetadata.AdditionalValues["PropertyName"] }) %>

...which仍可导致<select name=SkillLevels.Skilllevel>

问题

这里发生了什么事?为什么它要附加名称而不是仅仅使用它?你能提出一个好的解决办法吗?

更新:

最后,我编写了一个助手扩展,它可以对html文本进行查找/替换:

代码语言:javascript
复制
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元素分配一个复合名称,而不是我提供的确切名称?

EN

回答 2

Stack Overflow用户

发布于 2010-02-19 01:07:36

我一直在与MVC的跌落作斗争--它只是表现得不对。所以,我只是在我的模型数据上加上了我自己的html。这对您来说可能不是一个可以接受的解决方案,但是MVC在目标上是灵活的。

票数 1
EN

Stack Overflow用户

发布于 2010-07-12 22:57:50

免责声明:我不确定这是否完全安全,不会破坏任何东西。但我也面临着同样的情况。然而,一旦我设置了ViewData.TemplateInfo.HtmlFieldPrefix = String.Empty,问题就消失了。这种行为似乎是在定制模板内部设计的--例如,查看一下ViewData.TemplateInfo.GetFullHtmlFieldName

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2285924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档