EditorTemplate para DropDownList

Creé un EditorTemplate para los campos de cadena que implementa bootstrap de la siguiente manera:

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

Y puedo llamar esto simplemente así:

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

Mi pregunta: ¿Cómo haría esto para DropDownList para que simplemente pueda llamar a @ Html.EditorFor de la siguiente manera:

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

Por lo tanto, es básicamente una DropDownList genérica con estilo Twitter Bootstrap.

Opción 1

Crear una EditorTemplate llamada 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" })

y en la vista

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

pero esto significa que siempre tendrá que asignar `ViewBag.Items en el controlador

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

opcion 2

Modifique la EditorTemplate de EditorTemplate para aceptar EditorTemplate 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" })

y en la vista, pase SelectList en el parámetro additionalViewData SelectList

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

esto es mejor ya que no necesita confiar en ViewBag. Por ejemplo, si tenía un modelo de vista con una propiedad public SelectList CategoryItems { get; set; } public SelectList CategoryItems { get; set; } public SelectList CategoryItems { get; set; } entonces podrías usar

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

Opción 3

Crea tu propio ayudante utilizando los métodos de ayuda incorporados

 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()); } } } 

y en la vista

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