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