MVC3 ModelState 오류 제거


84

사용자가 로컬 파일 시스템에서 선택한 이미지를 업로드하는 상황이 있습니다. 내보기의 내 양식에는 기본적으로 두 개의 제출 버튼이 있습니다. 하나는 양식을 정상적으로 제출하는 데 사용되며 모든 유효성 검사가 실행됩니다. 두 번째는 이미지 업로드 전용이며,이 경우 아직 유효성을 검사하고 싶지 않습니다.

'이미지 업로드'제출 버튼에 "style-name cancel"클래스 값을 제공하여 클라이언트 측 유효성 검사를 해제했습니다.

<input type="submit" name="UploadImageButton" value="Upload Image" class="style-name cancel" /> 

이제 다시 게시 할 때 모델에 UploadImageButton 속성이 있고이 버튼을 클릭하면이 속성이 채워집니다 (입력 이름이 속성과 일치 함). 이렇게하면 양식이 실제 제출 단추 또는 UploadImageButton에 의해 제출되었는지 알 수 있습니다.

내 질문은 이것이 ... ServerSide 유효성 검사를 어떻게 해제 할 수 있습니까? 사용자가이 버튼을 클릭 할 때 유효성 검사 요약 정보가 표시되는 것을 원하지 않습니다. 이것을 사용하여 커스텀 모델 오류를 추가 할 수 있다는 것을 알고 있습니다.

ModelState.AddModelError("{key}", "{error msg}");

모델 오류를 제거하는 방법을 찾고 있습니다. 이것이 가능한가?

편집하다:

내가 생각해 낸 것은 다음과 같습니다.

foreach (var key in ModelState.Keys.ToList().Where(key => ModelState.ContainsKey(key))) {
     //ModelState.Remove(key); //This was my solution before
     ModelState[key].Errors.Clear(); //This is my new solution. Thanks bbak
}

왜하는 Where(key => ModelState.Keys.Contains(key))거야? ModelState.Keys의 각 키는 ModelState.Keys.Contains (key)가 true를 반환하기 때문에 Where 절이 중복 된 것 같습니다.
Maxim Zaslavsky 2011

1
가정에서 잘못되었지만 ModelState.ContainsKey에서 더 짧은 메서드를 사용하기 위해 질문과 텍스트를 업데이트했습니다. 이것들은 같은 일을하고 있습니다.
Jeff Reddy 2011

죄송합니다. 설명이 잘못되었거나 답장을 오해했을 수 있습니다. 당신이 맞아요 그 ModelState.ContainsKey(key)ModelState.Contains(key)같은 일을하지만, 제 요점은 모든 값이다 ModelState.Keys.ToList()본래 뜻에 포함 ModelState전체, 그래서 Where절은 중복 및 성능이 저하됩니다. 그래도 사소한 것.
Maxim Zaslavsky 2011

그것은 ReSharper가 그것을 함께 던졌습니다. 지적 해 주셔서 감사합니다.
Jeff Reddy 2011

1
제출의 소스가 된 버튼을 찾는 방법을 확인하십시오. ViewModel에서는이 속성을 가질 필요가 없습니다. Controller에 FormCollection 매개 변수를 추가하기 만하면됩니다 : public ActionResult Index (YourViewModelClass model, FormCollection formCollection). 버튼 이름이 있는지 확인합니다. if (formCollection [ "UploadImageButton"]! = null). 제출 버튼이 많을수록 더 좋다고 생각합니다.
jannagy02

답변:


146

다음과 같이 수행하여 모델 오류를 제거 할 수 있습니다.

if (ModelState.ContainsKey("{key}"))
    ModelState["{key}"].Errors.Clear();

1
이것이 바로 제가 찾던 것입니다. 선택한 답변을 변경했습니다 (죄송합니다. Adam Tuliper).
Jeff Reddy 2011 년

고마워요, 방금 몇 시간을 절약했습니다!
Agent007

1
이런 경우에 사람이도에 영향을 미치는, 궁금 해서요ModelState.IsValid
레드 TAZ

2
이상하게도 제 경우에는 이것으로 충분하지 않았습니다. ModelState [ "{key}"]. ValidationState = ModelValidationState.Valid를 추가해야했습니다.
AGuyCalledGerald

68

이것은 이전 답변을 구축하지만 조금 더 단순화합니다.

foreach (var modelValue in ModelState.Values)
{
    modelValue.Errors.Clear();
}

7

일반적으로 서버 측 유효성 검사를 끄거나 ModelState 오류를 수동으로 제거하지 않으려 고합니다. 가능하지만 문자열을 키로 사용해야하기 때문에 오류가 발생하기 쉽습니다. 정확하고 유용하기 때문에 키를 제거하는 방법에 대한 답변을 찬성했지만 강력하게 고려해야하는 경우에 자신을 디자인하지 않는 것이 좋습니다.

귀하의 경우 동일한 양식에 대해 여러 제출 버튼이 있지만 실제로 이미지를 업로드 할 때 양식을 제출하지 않습니다. 클라이언트 측 유효성 검사를 방지하려면 이미 표시 한대로 "취소"클래스를 사용할 수 있지만 두 번째 제출 버튼을 다른 양식에 두는 것이 좋습니다.이 경우 기본 양식에 대한 유효성 검사가 발생하지 않습니다.

다른 형식을 사용하는 두 번째 이점이 있습니다. 이미지를 업로드하는 논리를 처리하는 다른 ActionResult 메서드로 보낼 수 있습니다. 이 다른 방법은 단순히 모델 상태의 "IsValid"속성을 확인하는 데 신경 쓰지 않습니다. 이미지에 정보가 있는지 여부 만 신경 쓰고 별도로 확인할 수 있습니다. (동일한 ActionResult 메서드를 사용하더라도 모델 상태의 IsValid 속성에 의존하지 않도록 논리를 퍼널 할 수 있습니다.)

모델 상태에서 오류를 지워야하고 모두 지워야하는 경우 다음을 시도하십시오.

foreach (var key in ModelState.Keys)
{
    ModelState[key].Errors.Clear();
}

이렇게하면 키 이름을 올바르게 가져 오는 데 의존하지 않지만 모델에 이미 값 (유효 또는 유효하지 않음)이있는 경우 값이 유지됩니다.

이 경우 마지막으로 확인해야 할 사항은 뷰에 가끔 만있는 값이 있는지 여부입니다.이 값은 클라이언트 측 유효성 검사를 일으키지 않지만 (보기에는 없음) 서버 측 유효성 검사 문제를 발생시킵니다. 이 경우 @ Html.HiddenFor (model => model.PropertyName을 사용하는 것이 가장 좋습니다. 가능한 경우 값이 이미 설정되었다고 가정하면이보기에 표시되지 않습니다.


7

가끔 사용하기 때문에 확장 방법을 만들었습니다.

public static ModelStateDictionary ClearError(this ModelStateDictionary m, string fieldName)
{
    if (m.ContainsKey(fieldName))
        m[fieldName].Errors.Clear();
    return m;
}

여러 필드의 오류를 제거하는 데 유창하게 사용할 수 있습니다.


3

ModelState.Remove ( "{key}")를 사용하여 model에서 오류를 제거하면 ModelState.IsValid가 true로 재설정됩니다.

ModelState.Remove("{key}");
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.