Asp.net-Mvc

MVC 4,複選框列表和我

  • July 7, 2014

大家早。

我可以看到這已在其他地方討論過,但想知道對於像我這樣的傻瓜來說,MVC 4 中是否有任何變化或事情變得更簡單?!

設想

我有以下經過編輯的模型

public class CorporateDetails
{

   public Guid? Id { get; set; }

   [Key]
   public int CorporateDetailId { get; set; }

   public int? EmsId { get; set; }
   public string EmsName { get; set; }

   public virtual EmsType EmsType { get; set; }
}

public class EmsType
{
   [Key]
   public int? EmsId { get; set; }
   public string EmsName { get; set; }

   public virtual ICollection<EmsType> EmsTypes { get; set; }
}

使用以下標準創建視圖

<fieldset>
   <legend>CorporateDetails</legend>



   <div class="editor-label">
       @Html.LabelFor(model => model.EmsId, "EmsType")
   </div>
   <div class="editor-field">
       @Html.DropDownList("EmsId", String.Empty)
       @Html.ValidationMessageFor(model => model.EmsId)
   </div>
   <div class="editor-label">
       @Html.LabelFor(model => model.EmsName)
   </div>
   <div class="editor-field">
       @Html.EditorFor(model => model.EmsName)
       @Html.ValidationMessageFor(model => model.EmsName)
   </div>

   <p>
       <input type="submit" value="Create" />
   </p>
</fieldset>

這給了我一個開箱即用的漂亮下拉列表,來自Scott Gu 的部落格

現在我真正的問題是 - 我如何有效地將這個下拉框轉換為有效的多選複選框列表?

再次道歉,我只是在試水,看看是否發生了任何更新。

請注意,第一個 MVC 項目,所以慢慢來,我又覺得很厚:'(

好吧,我已經把它整理好了——萬歲!正如您從評論中看到的那樣,出現了一些問題,但請在下面找到有效的完整解決方案:D

模型

public class CorporateDetails
   {

       public Guid? Id { get; set; }

       [Key]
       public int CorporateDetailId { get; set; }

       public int[] EmsId { get; set; }

       }

   public class EmsType
   {
       [Key]
       public int EmsId { get; set; }
       public string EmsName { get; set; }

       public virtual ICollection<EmsType> EmsTypes { get; set; }
   }

控制器

public ActionResult Create()
   {
       CorporateDetails corporatedetails = new CorporateDetails();
       ViewBag.EmsId = new MultiSelectList(db.EmsTypes, "EmsId", "EmsName");
       return View(corporatedetails);
   }

擴展(放置在項目根目錄的文件夾中)

public static MvcHtmlString CheckBoxListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty[]>> expression, MultiSelectList multiSelectList, object htmlAttributes = null)
   {
       //Derive property name for checkbox name
       MemberExpression body = expression.Body as MemberExpression;
       string propertyName = body.Member.Name;

       //Get currently select values from the ViewData model
       TProperty[] list = expression.Compile().Invoke(htmlHelper.ViewData.Model);

       //Convert selected value list to a List<string> for easy manipulation
       List<string> selectedValues = new List<string>();

       if (list != null)
       {
           selectedValues = new List<TProperty>(list).ConvertAll<string>(delegate(TProperty i) { return i.ToString(); });
       }

       //Create div
       TagBuilder divTag = new TagBuilder("div");
       divTag.MergeAttributes(new RouteValueDictionary(htmlAttributes), true);

       //Add checkboxes
       foreach (SelectListItem item in multiSelectList)
       {
           divTag.InnerHtml += String.Format("<div><input type=\"checkbox\" name=\"{0}\" id=\"{0}_{1}\" " +
                                               "value=\"{1}\" {2} /><label for=\"{0}_{1}\">{3}</label></div>",
                                               propertyName,
                                               item.Value,
                                               selectedValues.Contains(item.Value) ? "checked=\"checked\"" : "",
                                               item.Text);
       }

       return MvcHtmlString.Create(divTag.ToString());
   }

在視圖的 Web 配置中註冊的擴展

<pages pageBaseType="System.Web.Mvc.WebViewPage">
 <namespaces>
   <add namespace="System.Web.Mvc" />
   <add namespace="System.Web.Mvc.Ajax" />
   <add namespace="System.Web.Mvc.Html" />
   <add namespace="System.Web.Optimization"/>
   <add namespace="System.Web.Routing" />
   <add namespace="MyProject.Extensions" />
 </namespaces>
</pages>

看法

@model Valpak.Websites.HealthChecker.Models.CorporateDetails
@{
   ViewBag.Title = "Create";
}
<h2>Create</h2>
@using (Html.BeginForm())
{
   @Html.ValidationSummary(true)

   <fieldset>
       <legend>CorporateDetails</legend>

          <div class="editor-label">
          @Html.CheckBoxListFor(model => model.EmsId, (MultiSelectList) ViewBag.EmsId)
         </div>          
       <p>
           <input type="submit" value="Create" />
       </p>
   </fieldset>
}
<div>
   @Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
   @Scripts.Render("~/bundles/jqueryval")
}

這給了我一個可愛的複選框列表。歡呼!

感謝達林的幫助,我已將此標記為答案,但您的時間和精力 +50。

引用自:https://stackoverflow.com/questions/11204464