2012-06-26 63 views
12

Buổi sáng tất cả.MVC 4, Danh sách hộp kiểm và tôi

Tôi có thể thấy điều này đã được thảo luận ở nơi khác nhưng đã tự hỏi nếu có bất cứ điều gì đã thay đổi hoặc mọi thứ được thực hiện đơn giản trong MVC 4 cho simpletons như tôi ?!

Kịch bản

Tôi có sau, chỉnh sửa, mô hình:

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

Với các tiêu chuẩn sau đây tạo xem:

<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> 

này mang lại cho tôi, ra của hộp, một thả xuống đẹp n danh sách a la Scott Gu's blog

Bây giờ câu hỏi thực sự của tôi là điều này - làm thế nào tôi có thể chuyển đổi hộp thả xuống này hiệu quả thành danh sách hộp kiểm đa lựa chọn?

Một lần nữa, xin lỗi vì đã vượt qua mặt đất đột ngột nhưng tôi chỉ đang thử nghiệm nước để xem có bất kỳ cập nhật nào đã xảy ra hay không.

Xin lưu ý, dự án MVC đầu tiên nên đi một cách nhẹ nhàng, tôi cảm thấy rất dày một lần nữa: '(

Trả lời

19

Được rồi, tôi đã nhận được nó - sắp xếp! Như bạn có thể nhìn thấy từ những ý kiến, đã có một vài vấn đề mà đã đưa ra nhưng xin vui lòng tìm thấy bên dưới các giải pháp hoàn chỉnh mà không làm việc: D

Mẫu

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

khiển

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

Tiện ích mở rộng (được đặt trong thư mục trong thư mục gốc của dự án)

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

Gia hạn đăng ký trong cấu hình web của Views

<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> 

Xem

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

nào mang lại cho tôi một danh sách đáng yêu của hộp kiểm. Tiếng hoan hô!

Cảm ơn Darin sự giúp đỡ của bạn, tôi đã đánh dấu đây là câu trả lời nhưng 50 dành thời gian và nỗ lực của bạn.

+0

Thực sự hữu ích, nhưng sẽ tốt hơn nếu xác thực được bao gồm. Hiện tại tất cả các hộp văn bản của tôi đều có đường viền màu đỏ nếu có vấn đề xác thực, bạn có biết cách đưa tính năng đó vào không? – Owen

2

Không có thay đổi xảy ra trong ASP.NET MVC 4 RC trong khía cạnh này và không có khả năng xảy ra khi nó chạm RTM .

Nhưng bạn có thể vẫn implement a custom helper để đạt được điều đó. Và thậm chí bạn có thể cải thiện helper này để nó mất một biểu thức lambda như là đối số đầu tiên thay vì một chuỗi để có phiên bản mạnh mẽ gõ.

Và nếu bạn không sử dụng enums đây là another example.

+0

Cảm ơn Darin - với exmaple gia hạn, nên tôi chỉ cần thêm đó là một nơi nào đó trong dự án của tôi hoặc đặc biệt trong quan điểm? (Xin lỗi cho câu hỏi ngu ngốc, nhìn thấy trước đó "dự án MVC đầu tiên" chú thích) –

+0

Bạn có thể tạo một thư mục 'Extensions' và có một lớp 'HtmlExtensions.cs' bên trong đó bạn sẽ khai báo. –

+0

Điều đó sẽ có ý nghĩa: D –

1

Nếu bạn vượt qua giá trị được lựa chọn để MultiSelected (tham số # 4)

ViewBag.VfonctionIds = new MultiSelectList(db.tbIntervenantFonctionTypes, "intervenantFonctionType_id", "Nom", fonctionSelected); 

Thay đổi Helper để

 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; 

     //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, 
               (item.Selected) ? "checked=\"checked\"" : "",              
               item.Text); 
     } 

     return MvcHtmlString.Create(divTag.ToString()); 
    } 
Các vấn đề liên quan