2012-02-09 82 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"})