ModelState.AddModelError-속성이 아닌 오류를 어떻게 추가합니까?


189

데이터베이스 Create(FooViewModel fvm){...}를 확인하여 fvm.prop1fvm.prop2이 조합에 이미 있는지 확인합니다 . 그렇다면 모델 상태에 오류를 추가하고 전체보기를 반환하고 싶습니다. 나는 시도했다 :

public ActionResult Create(FooViewModel fvm){
    if (ThatComboAlreadyExists(fvm)) {
      ModelState.AddModelError("Model", "There is already one like that");
      return View(fvm);
    }
}

...하지만에 오류가 표시되지 Html.ValidationSummary않습니다. '모델'이 올바른 키가 아니라는 의심이 있지만 구글에서 찾을 수 없었습니다.


답변:


330

나는 결국 내가 찾던 사용법 의 예 를 우연히 발견 했다. 평소와 같이 호출하는 속성 중 하나가 아니라 모델에 오류를 할당하는 것이 일반적이다.

ModelState.AddModelError(string key, string errorMessage);

그러나 키에 빈 문자열을 사용하십시오.

ModelState.AddModelError(string.Empty, "There is something wrong with Foo.");

오류 메시지가 <%: Html.ValidationSummary() %>예상대로 표시됩니다 .


22
이 경우는 다음과 같이 생각합니다. ModelState.AddError(errorMessage)또는 ModelState.AddGlobalError(errorMessage)... 와 같은 방법이없는 이유는 직관적이며 모델의 속성과 관련이없는 오류 메시지를 추가하는 방법을 찾는 것이 더 쉽습니다.
Rubens Mariuzzo

@Rubens : True이지만 확장 메소드를 사용하여 이러한 메소드를 쉽게 추가 할 수 있습니다.
Johnny5

2
@Html.ValidationMessage(string.Empty)
Ben Foster

키는 뷰에 바인딩 된 모델의 속성이므로 오류가 있습니다.
niico

1
ValidationSummaryErrors(bool excludePropertyErrors)인수가 허위 또는 만이 아닌 특성 별 경우 인수가 true의 경우 과부하 (키 = "") 오류를 모든 유효성 검사 오류가 표시됩니다.
Suncat2000

26

모델의 모든 속성에 모델 오류를 추가 할 수 있습니다. 새 속성을 만드는 것과 관련이없는 것이 좋습니다.

예를 들어 DB에서 이메일이 이미 사용 중인지 확인하고 조치의 Email 속성에 오류를 추가하여보기를 반환 할 때 오류가 있음을 알고 사용하여 표시하는 방법

<%: Html.ValidationSummary(true)%>
<%: Html.ValidationMessageFor(model => model.Email) %>

ModelState.AddModelError("Email", Resources.EmailInUse);

1
이것은 내 경우에 반 직관적 인 것처럼 보입니다-col1 및 col2의 특정 조합이 데이터베이스에 이미 있는지 확인하고 있으므로 ViewModel에 IsDuplicateOfAnotherRow 속성이있는 것이 옳지 않은 것 같습니다. 모델에 오류를 추가 할 수 있습니다-내 대답을 참조하십시오.
Scott Baker

1
깨지기 쉬운 리터럴 문자열을 사용하지 않고 AddModelError에 대해 "Email"문자열을 얻는 방법이 있습니까? 처럼 (m=>m.email).SomeMagicToString()?
Snekse

나는 그렇게 생각하지 않습니다, 당신은 마술 끈으로 가야합니다 ... 최고는 아니지만 여전히 좋은 해결책
VinnyG

4
nameofC # 6.0을 해결해 마법 문자열 문제에서 오는 연산자. msdn.microsoft.com/ko-kr/magazine/dn802602.aspx
RJ Cuthbertson

3

모델 도트 속성을 문자열에 넣는 것이 나를 위해 일했습니다. ModelState.AddModelError("Item1.Month", "This is not a valid date");


2
실제로 UI에 유효하지 않은 월이 표시되지만 원래 문제는 해결되지 않습니다.
Scott Baker

2
원래 문제는 방법에서 "키"가 무엇을 나타내는 지 이해하지 못했기 때문입니다. 이것은 "키"의 기능에 대한 약간의 설명을 제공하므로 키가 단지 속성 이름 일 필요는 없으며 중첩 된 속성이나 특수 값 String.Empty를 참조 할 수 있다는 것을 아는 것이 좋습니다.
Triynko
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.