[C#] ASP.NET MVC 4에서 확인란 값 가져 오기

ASP.NET MVC 4 앱에서 작업하고 있습니다. 이 앱에는 기본 형식이 있습니다. 내 양식의 모델은 다음과 같습니다.

public class MyModel
{
    public string Name { get; set; }
    public bool Remember { get; set; }
}

내 양식에는 다음 HTML이 있습니다.

<input id="Name" name="Name" type="text" value="@Model.Name" />
<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />
<label for="Remember">&nbsp;Remember Me?</label>

양식을 게시 할 때 모델의 Remember 값은 항상 false입니다. 그러나 모델의 Name 속성에는 값이 있습니다. 다음에서 중단 점을 설정하여이를 테스트했습니다.

[HttpPost]
public ActionResult MyAction(MyModel model)
{
  Console.WriteLine(model.Remember.ToString());
}

나는 그것을 이해할 수 없다. 체크 박스 값이 설정되지 않는 이유는 무엇입니까?



답변

@Html.EditorFor(x => x.Remember)

다음을 생성합니다.

<input id="Remember" type="checkbox" value="true" name="Remember" />
<input type="hidden" value="false" name="Remember" />

작동 원리 :

  • checkbox선택되지 않은 경우 양식은 hidden값 (false) 만 제출합니다.
  • 선택하면 양식 true은 모델 bool속성에 대한 두 개의 필드 (false 및 true)와 MVC 세트 를 제출
    합니다.

<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />

선택하면 항상 기본값을 보냅니다.


답변

Model.Name을 사용하여 값을 설정하기 때문입니다. 빈 뷰 모델을 뷰에 전달한다고 가정합니다.

따라서 Remember의 값은 false이고 확인란 요소의 값을 false로 설정합니다. 즉, 확인란을 선택하면 양식에 “false”값이 게시됩니다. 선택하지 않으면 게시되지 않으므로 모델은 기본적으로 false로 설정됩니다. 그렇기 때문에 두 경우 모두 거짓 값이 표시됩니다.

선택 상자를 선택한 경우에만 값이 전달됩니다. Mvc에서 확인란을 사용하려면

@Html.CheckBoxFor(x => x.Remember)

또는 모델을 뷰에 바인딩하지 않으려는 경우.

@Html.CheckBox("Remember")

Mvc는 선택되지 않은 값을 유지하기 위해 숨겨진 필드를 사용하여 몇 가지 마법을 수행합니다.

편집하는 것을 정말로 싫어하고 요소를 직접 생성하고 싶다면 그렇게 할 수 있습니다.

<input id="Remember" name="Remember" type="checkbox" value="true" @(Model.Remember ? "checked=\"checked\"" : "") />


답변

이것 만 사용

$("input[type=checkbox]").change(function () {
    if ($(this).prop("checked")) {
        $(this).val(true);
    } else {
        $(this).val(false);
    }
});


답변

대신에

 <input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />

사용하다:

 @Html.EditorFor(x => x.Remember)

특히 Remember에 대한 확인란이 제공됩니다.


답변

네, 체크 박스가 좀 이상합니다. Html 도우미를 사용하면 마크 업에 두 개의 체크 박스 입력이 생성되며, 체크되면 둘 다 IEnumerable의 이름-값 쌍으로 전달됩니다.

마크 업에서 체크하지 않으면 false 값을 가진 숨겨진 입력으로 만 전달됩니다.

예를 들어 마크 업에 다음이 있습니다.

      @Html.CheckBox("Chbxs") 

그리고 컨트롤러 작업에서 (이름이 컨트롤러의 확인란 매개 변수 이름과 일치하는지 확인하십시오) :

      public ActionResult Index(string param1, string param2,
      string param3, IEnumerable<bool> Chbxs)

그런 다음 컨트롤러에서 다음과 같은 작업을 수행 할 수 있습니다.

      if (Chbxs != null && Chbxs.Count() == 2)
        {
            checkBoxOnMarkup = true;
        }
        else
        {
            checkBoxOnMarkup = false;
        }

나는 이것이 우아한 해결책이 아니라는 것을 알고 있습니다. 여기 누군가가 몇 가지 지침을 줄 수 있기를 바랍니다.


답변

폼의 확인란에서 반환 된 값을 부울 속성으로 변환하기 위해 사용자 지정 ModelBinder의 빌드 변환기에서 ValueProviderResult를 사용했습니다.

ValueProviderResult cbValue = bindingContext.ValueProvider.GetValue("CheckBoxName");
bool value = (bool)cbValue.ConvertTo(typeof(bool));


답변

모델이 아닌 FormCollection으로 작업하는 경우 할당은 다음과 같이 간단 할 수 있습니다.

MyModel.Remember = fields["Remember"] != "false";