我有一個編輯器模板,其作業是將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
元素得到一個複合名稱而不是我提供的確切名稱?
是的,這很煩人。 DropDown支持和模板是MVC中真正可以改進的兩件事情。 – UpTheCreek 2011-04-13 12:16:28