2012-10-09 3 views
3

다음 문제가 발생합니다. 체크 박스에 체크 표시된 값이 포함 된 양식을 AJAX를 통해 API 컨트롤러에 제출하면 ModelState 객체에 유효하지 않습니다.체크 박스 내에 양식을 게시 할 때 ModelState가 유효하지 않음

전제 조건 :

  1. 비주얼 스튜디오 2012
  2. ASP.NET MVC 4 최종
  3. 최신 jQuery를 및 jQuery를 방해 검증 물건 (버전 1.8.2 및 1.9.0.1)

재현 단계 :

  1. 생성됨 부울 필드를 포함하는 형태의 뷰 모델 :
     
    public class CheckboxViewModel 
    { 
    [Display(Name="Test checkbox")] 
    public bool TestCheckbox { get; set; } 
    } 
    
  2. 단순히 뷰 모델을 준비하고 렌더링
  3. 만든 컨트롤러 액션 형태 :
     
    public ActionResult Index() 
    { 
        return View(new CheckboxViewModel()); 
    } 
    
  4. 이 양식보기를 만든
     
    @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" /> 
    } 
    
  5. modelstate이 유효한지 확인
  6. 만든 웹 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: trueTestCheckbox:false 포함되어 있음을 알아 냈어요, 그래서이 어쩌면 어떤 종류의 바인더에 영향을 미치는 예외를 throw 생각합니다. 이 문제를 해결하는 방법은 아직 없습니다.

답변

2

동일한 문제가있어서 JavaScript를 사용하여 웹 API에 양식을 보냈습니다. 다음은이 문제를 해결하는 데 사용할 수있는 기본 수정 사항입니다. 나는 그것이 단순한 또는 추한 일종의 - 그리고 당신이 많은 체크 박스를 가지고 있다면별로 실용적이지 않다는 것을 압니다. 그러나 아이디어는 간단하며 요구 사항을 충족시키기 위해 쉽게 확장 할 수 있습니다. 당신이 (jQuery를 사용하여) 양식을 게시하기 전에

이 추가 :

if ($('[name="MyCheckbox"]:checked').length > 0) 
    $('[name="MyCheckbox"]:hidden').detach(); 
else if ($('[name="MyCheckbox"]:hidden').length < 1) 
    $('#myForm').append('<input type="hidden" name="MyCheckbox" value="false" />'); 

// Etc... 
$.ajax({ }); 

그래서 체크 박스가 체크 상태의 경우, 당신은 숨겨진 필드를 제거, 당신은 체크 박스를 선택하지 않은 경우를 추가하고 숨겨진 필드 이미 삭제되었습니다.

이 바이올린을 참조하십시오 http://jsfiddle.net/Hsfdg/

+0

답장을 보내 주셔서 감사합니다. 그래, 그 작동, 여분의 jquery 물건 깨끗한 코드를 작성하는 데 도움이되지 않습니다. :) 나는 당신의 대답을 받아 들일 것이다. 그러나 knockoutjs와 clean javascript/jquery를 사용하기로 결정했기 때문에'EditorFor'를 버리고 원시 HTML을 사용했다. – sigurd

1

나는이

if ($('[name="MyCheckbox"]:checked').length > 0) 
    $('[name="MyCheckbox"]:hidden').detach(); 
else if ($('[name="MyCheckbox"]:hidden').length < 1) 
    $('#myForm').append('<input type="hidden" name="MyCheckbox" value="false" />'); 

을 구현하기 위해 노력하지만, 숨겨진 체크 박스가 분리 될 때 제거되는 모델 속성을했다.

Instad에서 숨겨진 chechbox 값을 true로 설정하면 model 속성을 true로 설정하면 예상되는 값이 false로 설정됩니다. 기본값은 false입니다.

if ($('[name="MyCheckbox"]:checked').length > 0) 
    $('[name="MyCheckbox"]:hidden').val(true); 
관련 문제