EditorTemplate for DropDownList

Eu criei um EditorTemplate para campos de seqüência de caracteres que implementa o bootstrap da seguinte maneira:

@using MyProject @model object 
@Html.LabelFor(m => m, new { @class = "col-md-3 control-label" })
@Html.TextBox( "", ViewData.TemplateInfo.FormattedModelValue, htmlAttributes) @Html.ValidationMessageFor(m => m, null, new { @class = "help-block" })

E eu posso chamar isso simplesmente assim:

 @Html.EditorFor(model => model.FirstName,"BootstrapString") 

Minha pergunta: Como eu faria isso para um DropDownList para que eu pudesse simplesmente chamar @ Html.EditorFor da seguinte maneira:

 @Html.EditorFor(model => model.CategoryId,new SelectList(ViewBag.Categories, "ID", "CategoryName")) 

Então, é basicamente um DropDownList genérico com o estilo Twitter Bootstrap.

Opção 1

Crie um EditorTemplate chamado BootstrapSelect.cshtml

 @model object 
@Html.LabelFor(m => m, new { @class = "col-md-3 control-label" })
@Html.DropDownListFor(m => m, (SelectList)ViewBag.Items, new { @class = "form-control"}) @Html.ValidationMessageFor(m => m, null, new { @class = "help-block" })

e na visão

 @Html.EditorFor(m => m.CategoryId, "BootstrapSelect") 

mas isso significa que você sempre precisa atribuir ‘ViewBag.Items no controlador

 var categories = // get collection from somewhere ViewBag.Items = new SelectList(categories, "ID", "CategoryName"); 

opção 2

Modifique o EditorTemplate para aceitar ViewData adicional

 @model object 
@Html.LabelFor(m => m, new { @class = "col-md-3 control-label" })
@Html.DropDownListFor(m => m, (SelectList)ViewData["selectList"], new { @class = "form-control"}) @Html.ValidationMessageFor(m => m, null, new { @class = "help-block" })

e na visão passar o SelectList no parâmetro additionalViewData

 @Html.EditorFor(m => m.CategoryId, "BootstrapSelect", new { selectList = new SelectList(ViewBag.Categories, "ID", "CategoryName") }) 

Isso é melhor porque você não precisa confiar no ViewBag. Por exemplo, se você tivesse um modelo de exibição com uma propriedade public SelectList CategoryItems { get; set; } public SelectList CategoryItems { get; set; } public SelectList CategoryItems { get; set; } então você poderia usar

 @Html.EditorFor(m => m.CategoryId, "BootstrapSelect", Model.CategoryItems) 

Opção 3

Crie seu próprio ajudante utilizando os methods auxiliares integrados

 using System; using System.Linq.Expressions; using System.Text; using System.Web.Mvc; using System.Web.Mvc.Html; namespace YourAssembly.Html { public static class BootstrapHelper { public static MvcHtmlString BootstrapDropDownFor(this HtmlHelper helper, Expression> expression, SelectList selectList) { MvcHtmlString label = LabelExtensions.LabelFor(helper, expression, new { @class = "col-md-3 control-label" }); MvcHtmlString select = SelectExtensions.DropDownListFor(helper, expression, selectList, new { @class = "form-control" }); MvcHtmlString validation = ValidationExtensions.ValidationMessageFor(helper, expression, null, new { @class = "help-block" }); StringBuilder innerHtml = new StringBuilder(); innerHtml.Append(select); innerHtml.Append(validation); TagBuilder innerDiv = new TagBuilder("div"); innerDiv.AddCssClass("col-md-9"); innerDiv.InnerHtml = innerHtml.ToString(); StringBuilder outerHtml = new StringBuilder(); outerHtml.Append(label); outerHtml.Append(innerDiv.ToString()); TagBuilder outerDiv = new TagBuilder("div"); outerDiv.AddCssClass("form-group"); outerDiv.InnerHtml = outerHtml.ToString(); return MvcHtmlString.Create(outerDiv.ToString()); } } } 

e na visão

 @Html.BootstrapDropDownFor(m => m.CategoryId, new SelectList(ViewBag.Categories, "ID", "CategoryName"))