Asp.net-Mvc
MVC 4,複選框列表和我
大家早。
我可以看到這已在其他地方討論過,但想知道對於像我這樣的傻瓜來說,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。