2012-02-09 178 views
1

我想減少代碼的使用量。我有一個string.cshtml和multiline.cshtml EditorTemplate的字符串和textareas。它們足夠通用,只需使用一次即可。例如,這是我的string.cshtml(沒有額外的HTML):DropDownList的Generic EditorTemplate?

@Html.Label(ViewData.ModelMetadata.DisplayName) 

@Html.TextBox("", 
ViewData.TemplateInfo.FormattedModelValue, 
new { placeholder = ViewData.ModelMetadata.Watermark }) 

@if (ViewData.ModelMetadata.IsRequired) 
    { 
     @:<span class="required"></span> 
    } 
@Html.ValidationMessage("") 

這和我的textarea差不多。我希望做的是爲我的下拉列表創建一個類似的EditorTemplate。喜歡的東西:

... 
@Html.DropDown("", ......) 
.... 

我曾嘗試使用代碼括號中的文本框上面的變化,我已經嘗試搞清楚,根據我的實際下拉列表,什麼樣的代碼在那裏去。我沒有運氣。

這種方式我可以使用[UIHint("TemplateName")]或做一些像@Html.EditorFor(m => m.MyProperty, "TemplateName")來打電話給它。

這裏是我的下拉列表看起來像一個普通視圖:

... 
@Html.DropDownListFor 
(m => m.MyProperty, 
new SelectList(Model.MyPropertyList, 
"Value", "Text")) 
... 

上面的代碼工作在我的意見精細,如果沒有解決方案,我就繼續重新使用它。不過,我還想創建其他dropdownlists,並且希望將所有dropdownlists放入模板以供重用。我認爲最好有一個dropdownlist EditorTemplate來統治它們。 ;)

回答

3

麻煩的是,爲了產生一個下拉列表,你需要2個屬性:一個標量屬性(MyProperty在你的例子)到所選擇的價值,並在你的榜樣集合屬性(MyPropertyList)綁定。編輯器模板適用於單個屬性。所以,除非你定義了一些泛型類,這些泛型類將包含這兩個屬性來表示下拉列表,然後爲這個泛型類定義一個編輯器模板,那麼你當前的代碼也可以正常工作。

+0

謝謝大家了很好的解釋。我只需將我的工作代碼放在一個帶有其他表單控件的模板中即可重用。這些模板已經在使用'@ Html.EditorFor()',它使用String.cshtml和MultilineText.cshtml EditorTemplates。 – REMESQ 2012-02-09 23:37:35

0

不是最好的解決辦法,但

@Html.DropDownList(ViewData.TemplateInfo.FormattedModelValue.ToString(), 
new SelectList(ViewData["GenericSelectionList"] as IList), 
ViewData["Id"].ToString(), ViewData["Name"].ToString()) 

,然後在你的父視圖(或在以往任何時候都應該叫)

@html.EditorFor(x=> Model.ScalarProperty, new {GenericSelectionList =YourList, Id ="IdProperty", Name ="NameProperty"})