2010-02-18 104 views
1

我有一個編輯器模板,其作業是將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元素得到一個複合名稱而不是我提供的確切名稱?

+0

是的,這很煩人。 DropDown支持和模板是MVC中真正可以改進的兩件事情。 – UpTheCreek 2011-04-13 12:16:28

回答

1

我一直在努力與MVC下拉 - 它只是不正確的行爲。所以,我只是在我的模型數據上使用foreach來展示我自己的html。這對你來說可能不是一個可以接受的解決方法,但MVC的目的是靈活的。

1

聲明:我不確定這是否完全安全,不會破壞任何內容。 但我面臨着完全相同的情況。但是,一旦我設置 ViewData.TemplateInfo.HtmlFieldPrefix = String.Empty, 問題就消失了。這種行爲似乎是自定義模板中的設計 - 例如,看看ViewData.TemplateInfo.GetFullHtmlFieldName

相關問題