我正在努力减少代码使用量。我有一个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来统治它们。 ;)
答案 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"})