DropDownList的通用EditorTemplate?

时间:2012-02-09 22:51:30

标签: asp.net-mvc-3 drop-down-menu

我正在努力减少代码使用量。我有一个string.cshtml和multiline.cshtml EditorTemplate用于字符串和textareas。它们非常通用,只需使用一次。例如,这是我的string.cshtml(没有多余的HTML):

@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"))
...

以上代码在我的视图中工作很好,如果没有解决方案,我会继续重复使用它。但是,我还有其他要创建的下拉列表,我想将所有下拉列表放在模板中以供重用。我认为最好有一个下拉列表EditorTemplate来统治它们。 ;)

2 个答案:

答案 0 :(得分:3)

问题是,为了生成下拉列表,您需要2个属性:标量属性(示例中为MyProperty)以将选定值绑定到集合属性(MyPropertyList例)。编辑器模板适用于单个属性。因此,除非您定义一些包含这两个属性的泛型类来表示下拉列表,然后为此泛型类定义编辑器模板,否则当前代码也应该正常工作。

答案 1 :(得分: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"})