2012-10-29 5 views
0

보기에서 모델을 수신 중입니다.
값의 일부가 자동으로 입력된다MVC ModelState가 오류를 잘못보고 함

을하지만, 필요한 값의 일부는과 같이, 수동으로 추가해야합니다.

ModelState.IsValid은 다음과 같습니다

[HttpPost] 
public ActionResult Foobar(FooModel model, FormCollection collection) 
{ 
    // "timePicker" is a dropdown list containing different times 
    var time = collection["timePicker"].Split(':'); 
    model.Hours = int.Parse(time[0]); 
    model.Minutes = int.Parse(time[1]); 

    if (ModelState.IsValid) 
    { 
     ... // Do stuff 
    } 
} 

을 그래서 여기가 문제 야 그릇된.
디버깅 한 결과 model.Minutesmodel.Hours이 할당되지 않았습니다.
... 이 (가) 값을 할당했기 때문에 사실이 아닙니다.

나는 ModelState.Clear()을 사용하는 것으로 생각했지만, 나머지 정보가 모두 유효한지 수동으로 확인하고 싶지는 않습니다.

다른 방법으로 문제를 해결할 수 있습니까?

답변

3

글쎄, 모델 바인딩, 퍼팅 오류 ModelState, 작업을 입력하기 전에 완료되었습니다.

MinutesHours 오류는 시간과 분으로 값을 추가하기 전에 오류가 ModelState에 발생하므로 유효하지 않습니다.

당신은 수행하여, (수행 Clear()로, 그리고 모든 오류) 이러한 오류를 제거 할 수 있습니다

ModelState.Remove("Hours"); 
ModelState.Remove("Minutes"); 

사용자 정의 ModelBinder를을 생성하는 것이 문제를 해결 (사용)하는 또 다른 방법.

+0

+1하지만 키가 없으면 예외가 throw되는지 여부를 기억할 수 없습니다. 아마도 :) – mattytommo

+0

@mattytommo이 경우 키가 항상 존재해야합니다. 그런데이 메서드는 키를 제거 할 수 없으면 (읽기 전용 사전 또는 기존 키가 아닌) false를 반환하고 키가 제거 된 경우 true를 반환합니다. –

+0

@JacobSpire 그런데,이 경우 ViewModel int를 사용할 수도 있습니다. 아마 더 좋을 것입니다 (또는 사용자 정의 ModelBinder). –

관련 문제