EditorTemplate for DropDownList

后端 未结 1 1252
悲哀的现实
悲哀的现实 2020-11-27 07:44

I\'ve created an EditorTemplate for string fields that implements bootstrap as follows:

@using MyProject
@model object
@
相关标签:
1条回答
  • 2020-11-27 08:06

    Option 1

    Create an EditorTemplate named BootstrapSelect.cshtml

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

    and in the view

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

    but this means you would alway need to assign `ViewBag.Items in the controller

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

    Option 2

    Modify the EditorTemplate to accept additional ViewData

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

    and in the view pass the SelectList in the additionalViewData parameter

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

    this is better in that you don't need to rely on ViewBag. For example, if you had a view model with a property public SelectList CategoryItems { get; set; } then you could use

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

    Option 3

    Create your own helper utilizing the built-in helper methods

    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<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> 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());
        }
      }
    }
    

    and in the view

    @Html.BootstrapDropDownFor(m => m.CategoryId, new SelectList(ViewBag.Categories, "ID", "CategoryName"))
    
    0 讨论(0)
提交回复
热议问题