2014-02-17 51 views
2

我下面这个例子如何将复选框值绑定到整数列表?

enter link description here

但是,当我提出,它说不能转换“假”到“廉政”

,我认为其或真或假,这是获得通过,而不是实际值

我做错了什么?

我的模型是

public IEnumerable<AllocateRequirementViewModel> Requirements { get; set; } 

    public List<int> RequirementIds { get; set; } 

那么我的剃须刀

<div id="RequirementsContainer"> 
      @foreach (var requirement in Model.Requirements) 
      { 
       <div class="row"> 
        <input id="@requirement.Id" type="checkbox" name="RequirementIds" value="@requirement.Id" /> @requirement.Description 
       </div> 
      } 
     </div> 

回答

1

您的模型将需要同时包含检查的值,以及所有可能的值。

public class TestViewModel 
{ 
    public Guid Id { get; set; } 
    public IDictionary<Guid, String> AllCheckboxOptions { get; set; } 
    public Guid[] CheckedOptions { get; set; } 
} 

我在我的数据库使用的GUID作为的PK所以这些都是从数据库

然后,我创建了一些扩展方法生成HTML

public static MvcHtmlString CheckBoxList(this HtmlHelper htmlHelper, String name, List<SelectListItem> listInfo, 
     IDictionary<String, Object> htmlAttributes, Int32 columns) 
    { 
     if (String.IsNullOrEmpty(name)) 
      throw new ArgumentException("The argument must have a value", "name"); 
     if (listInfo == null) 
      throw new ArgumentNullException("listInfo"); 
     if (!listInfo.Any()) 
      return new MvcHtmlString(String.Empty); 

     var outerSb = new StringBuilder(); 

     for (Int32 i = 0; i < columns; i++) 
     { 
      var listBuilder = new TagBuilder("ul"); 
      if (columns > 1) 
       listBuilder.MergeAttribute("class", "column"); 

      var innerSb = new StringBuilder(); 

      var take = listInfo.Count % columns == 0 
       ? listInfo.Count/columns 
       : (listInfo.Count/columns) + 1; 

      var items = listInfo.Skip(i * take).Take(take); 

      foreach (var info in items) 
      { 
       var inputBuilder = new TagBuilder("input"); 
       if (info.Selected) inputBuilder.MergeAttribute("checked", "checked"); 
       inputBuilder.MergeAttribute("type", "checkbox"); 
       inputBuilder.MergeAttribute("value", info.Value); 
       inputBuilder.MergeAttribute("id", info.Value); 
       inputBuilder.MergeAttribute("name", info.Value); 

       var labelBuilder = new TagBuilder("label"); 
       labelBuilder.MergeAttribute("for", @info.Value); 
       labelBuilder.InnerHtml = info.Text; 

       var listItemWrapper = new TagBuilder("li"); 
       //may have to encode here. 
       listItemWrapper.InnerHtml = inputBuilder.ToString(TagRenderMode.SelfClosing) + labelBuilder.ToString(TagRenderMode.Normal); 

       innerSb.Append(listItemWrapper.ToString(TagRenderMode.Normal)); 
      } 

      listBuilder.InnerHtml = innerSb.ToString(); 
      outerSb.Append(listBuilder.ToString(TagRenderMode.Normal)); 
     } 

     return new MvcHtmlString(outerSb.ToString()); 
    } 

然后在视图的ID你可以打电话给你的扩展方法

@Html.CheckBoxList("yourtypes", (from o in Model.AllCheckboxOptions 
             select new SelectListItem 
             { 
              Text = o.Value, 
              Selected = Model.CheckedOptions.Contains(o.Key), 
              Value = o.Key.ToString() 
             }).ToList()) 

我用这种技术与b另外MVC3和MVC4成功。

相关问题