2013-05-11 2 views
2

여기 내 코드의 선택 무엇이 거짓 값을 전송하지 유지 :CheckBox 구성 도우미 상관없이

@using (Html.BeginForm("AddMCondition", "Admin")) 
{ 
    <td class="admin-textbox"> 
     @Html.TextBox("txtMCondition") 
    </td> 
    <td> 
    @foreach (var exerType in Model.AllExerciseTypes) 
    { 
     <label> 
     @Html.CheckBox("RestrictedType") 
     @exerType.Name 
     </label> 
    } 
     <input type="submit" value="Add Medical Condition" /> 
    </td> 
} 

는이 내가 컨트롤러에서 값을 검색하고있어 어떻게

public ActionResult AddMCondition(string txtMCondition, string[] RestrictedType) 
{ 
    //Code here... 
} 

가 만 3 항목에서 AllExerciseTypes 모음집입니다. 각각의 체크 박스가 적어도 false 값을 컨트롤러에 보내고 있는지 여부에 관계없이 선택되었습니다. 확인란을 선택하지 않으면 콜렉션에서 3 개의 false가 반환됩니다. 1 체크 박스를 선택하면 4 개의 값, 즉 참 및 거짓 3 개를 얻습니다. 모두 체크하면 True, False, True, False, True, False의 3 가지 값을 얻습니다.

각 상황에서 적어도 false를 보내는 이유는 무엇입니까?

답변

0

확인란이 선택되지 않은 경우에도 확인란에 대한 HTML 도우미가 값이 false 인 추가 숨겨진 필드를 추가하여 무언가가 서버에 다시 게시되도록하기 때문입니다. 양식에 <input type="checkbox" name="cbSomething" value="true"/>을 추가하고 확인란을 선택하지 않고 게시하면 값이 서버로 다시 전송되지 않습니다. 강력한 형식의 도우미 확장 (예 : Html.CheckBoxFor(m => m.RestrictedType))을 사용하고 모델의 속성에 확인란을 바인딩하면 모델 바인더는 값을 모델 속성에 올바르게 바인딩합니다. 다음은 MVC의 입력 확장 코드 스 니펫입니다.

if (inputType != InputType.CheckBox) 
    return TagBuilderExtensions.ToMvcHtmlString(tagBuilder1, TagRenderMode.SelfClosing); 
    StringBuilder stringBuilder = new StringBuilder(); 
    stringBuilder.Append(tagBuilder1.ToString(TagRenderMode.SelfClosing)); 
    TagBuilder tagBuilder2 = new TagBuilder("input"); 
    tagBuilder2.MergeAttribute("type", HtmlHelper.GetInputTypeString(InputType.Hidden)); 
    tagBuilder2.MergeAttribute("name", fullHtmlFieldName); 
    tagBuilder2.MergeAttribute("value", "false"); 
    stringBuilder.Append(tagBuilder2.ToString(TagRenderMode.SelfClosing)); 
    return MvcHtmlString.Create(((object) stringBuilder).ToString()); 
+0

죄송합니다. 이해가 가지 않습니다. value = "true"를 추가해야합니까? 체크 박스를 체크하지 않은 경우 어떻습니까? 그 값은 컨트롤러 레벨에서 여전히 유효 할 것입니다. – Richard77

+0

아니, 그건 그냥 임의의 값 이었어. 확인란을 선택하지 않으면 false 값이 숨겨진 필드로 인해 해당 확인란의 이름과 함께 서버에 다시 게시됩니다. 확인란을 선택하면 확인란에 명시 적으로 설정 한 값도 함께 게시됩니다 (일반적으로 확인란이 부울 값으로 사용되기 때문에 true). 모델 바인딩을 사용하는 경우 바인더는 2 개의 값이 다시 전송 되더라도 확인란을 선택했는지에 따라 모델 속성을 true 또는 false로 설정할 것인지 여부를 알 수 있습니다. – levelnis

+0

모델이 거대하고 전체 페이지에 더 많은 양식이 있기 때문에 모델을 사용할 수 없습니다. 어쩌면 내가 논리를 직접 구현하는 것, 즉 거짓과 진실의 패턴을 발견 했는지도 모른다. – Richard77