다음 문제가 발생합니다. 체크 박스에 체크 표시된 값이 포함 된 양식을 AJAX를 통해 API 컨트롤러에 제출하면 ModelState 객체에 유효하지 않습니다.체크 박스 내에 양식을 게시 할 때 ModelState가 유효하지 않음
전제 조건 :
- 비주얼 스튜디오 2012
- ASP.NET MVC 4 최종
- 최신 jQuery를 및 jQuery를 방해 검증 물건 (버전 1.8.2 및 1.9.0.1)
재현 단계 :
- 생성됨 부울 필드를 포함하는 형태의 뷰 모델 :
public class CheckboxViewModel { [Display(Name="Test checkbox")] public bool TestCheckbox { get; set; } }
단순히 뷰 모델을 준비하고 렌더링
- 만든 컨트롤러 액션 형태 :
public ActionResult Index() { return View(new CheckboxViewModel()); }
- 이 양식보기를 만든
@using (Ajax.BeginForm("Post", "api/Values", null, new AjaxOptions { HttpMethod = "POST" }, new { id = "form" })) { @Html.ValidationSummary(true) @Html.LabelFor(model => model.TestCheckbox) @Html.EditorFor(model => model.TestCheckbox) @Html.ValidationMessageFor(model => model.TestCheckbox) <input type="submit" value="Submit" /> }
modelstate이 유효한지 확인
- 만든 웹 API 액션 그렇지 않으면 400 상태 코드 (200)를 반환 :
public HttpResponseMessage Post(CheckboxViewModel model) { if (!ModelState.IsValid) return new HttpResponseMessage(HttpStatusCode.BadRequest); return new HttpResponseMessage(HttpStatusCode.OK); }
나는 약간의 인터넷 검색을 해봤 내가 확인란에 대한 편집기가 추가 hidd를 렌더링하는 것을 알고 en 필드가 있지만 괜찮을 것으로 보이며 모델 바인딩에 필요합니다. 그래서 체크 박스를 선택 취소하고 양식을 제출하면 모든 것이 잘 작동하고 서버는 숨겨진 필드 덕분에 상태 200으로 응답합니다. 그러나 확인란을 선택하고 양식을 제출하면 서버는 상태 400으로 응답하며 ModelState가 유효하지 않은 상태임을 나타냅니다. 이 경우 ModelState에는 ErrorMessage가 비어 있고 예외 메시지와 함께 오류가 있습니다.
{System.InvalidOperationException: The parameter conversion from type 'System.Collections.Generic.List`1[System.String]' to type 'System.Boolean' failed because no type converter can convert between these types.
в System.Web.Http.ValueProviders.ValueProviderResult.ConvertSimpleType(CultureInfo culture, Object value, Type destinationType)
в System.Web.Http.ValueProviders.ValueProviderResult.UnwrapPossibleArrayType(CultureInfo culture, Object value, Type destinationType)
в System.Web.Http.ValueProviders.ValueProviderResult.ConvertTo(Type type, CultureInfo culture)
в System.Web.Http.ValueProviders.ValueProviderResult.ConvertTo(Type type)
в System.Web.Http.ModelBinding.Binders.TypeConverterModelBinder.BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)}
이 문제를 올바르게 처리 할 방법이 없습니다. 맞춤형 모델 바인더를 만들어야합니까? 또는 나는 무엇인가 놓치고 있냐? 도움이 될 것입니다. 감사.
내 문제를 재현하는 solution을 만들었습니다.
UPDATE : 나는 양식을 실제로 값 TestCheckbox: true
및 TestCheckbox:false
포함되어 있음을 알아 냈어요, 그래서이 어쩌면 어떤 종류의 바인더에 영향을 미치는 예외를 throw 생각합니다. 이 문제를 해결하는 방법은 아직 없습니다.
답장을 보내 주셔서 감사합니다. 그래, 그 작동, 여분의 jquery 물건 깨끗한 코드를 작성하는 데 도움이되지 않습니다. :) 나는 당신의 대답을 받아 들일 것이다. 그러나 knockoutjs와 clean javascript/jquery를 사용하기로 결정했기 때문에'EditorFor'를 버리고 원시 HTML을 사용했다. – sigurd