2014-02-17 2 views
2

나는이 예체크 박스 값을 int리스트에 바인드하는 방법은 무엇입니까?

enter link description here

을 다음 그러나하고 내가 제출할 때, 그것은 '내부'에서 'false'로 변환 할 수 없습니다 말했다

나는 그것의 거짓 또는 진실 건네지고 그 가정으로 , 실제 값이 아님

내가 뭘 잘못하고 있니?

내 모델은

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

입니다. 내 데이터베이스에 PK와 같은 GUID를 사용

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

그래서이 내가 다음보기에서

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

다음 HTML을 생성하기 위해 확장 메소드를 생성

데이터베이스에서 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가 성공했습니다.

관련 문제