ASP.NET MVC Html.ValidationSummary (true)는 모델 오류를 표시하지 않습니다


194

Html.ValidationSummary에 문제가 있습니다. ValidationSummary에 속성 오류를 표시하고 싶지 않습니다. 그리고 Html.ValidationSummary (true)를 설정하면 ModelState의 오류 메시지가 표시되지 않습니다. 문자열에 대한 컨트롤러 동작에 예외가있는 경우

MembersManager.RegisterMember(member);

catch 섹션은 ModelState에 오류를 추가합니다.

ModelState.AddModelError("error", ex.Message);

그러나 ValidationSummary는이 오류 메시지를 표시하지 않습니다. Html.ValidationSummary (false)를 설정하면 모든 메시지가 표시되지만 속성 오류를 표시하고 싶지 않습니다. 이 문제를 어떻게 해결할 수 있습니까?

사용중인 코드는 다음과 같습니다.

모델:

public class Member
{
        [Required(ErrorMessage = "*")]
        [DisplayName("Login:")]
        public string Login { get; set; }

        [Required(ErrorMessage = "*")]
        [DataType(DataType.Password)]
        [DisplayName("Password:")]
        public string Password { get; set; }

        [Required(ErrorMessage = "*")]
        [DataType(DataType.Password)]
        [DisplayName("Confirm Password:")]
        public string ConfirmPassword { get; set; }
}

제어 장치:

[HttpPost]
public ActionResult Register(Member member)
{
    try
    {
        if (!ModelState.IsValid)
            return View();

        MembersManager.RegisterMember(member);
    }
    catch (Exception ex)
    {
        ModelState.AddModelError("error", ex.Message);

        return View(member);
    }
}

전망:

<% using (Html.BeginForm("Register", "Members", FormMethod.Post, 
                        new { enctype = "multipart/form-data" })) {%> 
    <p>
        <%= Html.LabelFor(model => model.Login)%>
        <%= Html.TextBoxFor(model => model.Login)%>
        <%= Html.ValidationMessageFor(model => model.Login)%>
    </p>

    <p>
        <%= Html.LabelFor(model => model.Password)%>
        <%= Html.PasswordFor(model => model.Password)%>
        <%= Html.ValidationMessageFor(model => model.Password)%>
    </p>

    <p>
        <%= Html.LabelFor(model => model.ConfirmPassword)%>
        <%= Html.PasswordFor(model => model.ConfirmPassword)%>
        <%= Html.ValidationMessageFor(model => model.ConfirmPassword)%>
    </p>

    <div>
        <input type="submit" value="Create" />
    </div>

    <%= Html.ValidationSummary(true)%>
<% } %>

답변:


324

ValidationSummary 플래그가 작동하는 방식은 ModelErrors 만 string.empty키로 표시하는 것 입니다. 그렇지 않으면 속성 오류라고 가정합니다. 추가하는 사용자 정의 오류에는 'error'키가 있으므로 ValidationSummary (true)를 호출 할 때 표시되지 않습니다. 다음과 같이 빈 키를 사용하여 사용자 지정 오류 메시지를 추가해야합니다.

ModelState.AddModelError(string.Empty, ex.Message);

9
@LordCover : 이것이 버그가 아닌 "설계 된대로 작동하는 것"이라고 생각합니다. 기본적으로 사용되는 ValidationSummary ()의 과부하는 모델 자체의 속성과 관련된 ModelState 오류를 제외합니다. 이렇게하면 해당 오류가 요약에서 중복되지 않고 각 개별 속성에 대한 Html.ValidationMessageFor () 호출로 표시됩니다. 비어 있지 않은 키로 추가 된 모델 오류는 키가 속성 이름과 일치하지 않더라도 모델 속성과 연결된 것으로 간주됩니다.
다니엘 샤퍼

26
다른 구현자를위한 참고 사항 : ModelState.AddModelError(string.Empty, ex);작동하지 않는 것 같습니다. ModelState.AddModelError(string, string)위에 표시된대로 과부하를 사용해야합니다 .
wolfyuk

2
업데이트 : MVC4에서는 더 이상 그렇지 않습니다. ModelState.AddModelError ( "", ex.Message); 작품
Neil Thompson

4
MVC5 그래도 ex.Message를 호출해야 작동했습니다.
smiggleworth

하루를 구했다! MVC5는 여전히 몇 가지 문제가 있습니다 :)
juFo

67

지정된 키에 대해 validationMessage를 표시 할 수 있으므로 더 효과적입니다.

    ModelState.AddModelError("keyName","Message");

다음과 같이 표시하십시오.

    @Html.ValidationMessage("keyName")

28

나는 이것이 오래된 종류라는 것을 알고 있으며 147 위로 투표하여 답변으로 표시되었지만 고려해야 할 다른 것이 있습니다.

필요하면 ValidationSummary에 모든 모델 오류, 속성 이름 및 string.Empty 키가 모두 표시 될 수 있습니다. 이를 수행하는 ValidationSummary에 과부하가 있습니다.

    //   excludePropertyErrors:
    //   true to have the summary display model-level errors only, or false to have
    //   the summary display all errors.
    public static MvcHtmlString ValidationSummary(this HtmlHelper htmlHelper, bool excludePropertyErrors);

여기에 이미지 설명을 입력하십시오


5
예! 다음 @Html.ValidationSummary(true, "", new { @class = "text-danger" })으로 변경 :@Html.ValidationSummary(false, "", new { @class = "text-danger" })
Xeningem

7

아마도 그렇게 :

[HttpPost]
public ActionResult Register(Member member)
{
    try
    {
       if (!ModelState.IsValid)
       {
          ModelState.AddModelError("keyName", "Form is not valid");
          return View();
       }
       MembersManager.RegisterMember(member);
    }
    catch (Exception ex)
    {
       ModelState.AddModelError("keyName", ex.Message);
       return View(member);
    }
}

그리고 디스플레이에 추가하십시오 :

<div class="alert alert-danger">
  @Html.ValidationMessage("keyName")
</div>

또는

<div class="alert alert-danger">
  @Html.ValidationSummary(false)
</div>

5
@Html.ValidationSummary(false,"", new { @class = "text-danger" })

이 줄을 사용하면 도움이 될 수 있습니다


cshtml 파일에서 위의 행을 추가하십시오.
sachind

2

내 경우에는 반환 때문에 작동하지 않았습니다.

사용하는 대신:

return RedirectToAction("Rescue", "CarteiraEtapaInvestimento", new { id = investimento.Id, idCarteiraEtapaResgate = etapaDoResgate.Id });

나는 사용했다 :

return View("ViewRescueCarteiraEtapaInvestimento", new CarteiraEtapaInvestimentoRescueViewModel { Investimento = investimento, ValorResgate = investimentoViewModel.ValorResgate });

그것은 모델이므로 ModelState.AddModelError("keyName","Message");모델과 함께 작동 해야하는 것은 분명합니다.

이 답변은 이유를 보여줍니다. DataAnnotations로 유효성 검사 추가


0

거의 모든 것이 옳은 것처럼 보일 경우, 다음 과 같은 CSS 재정의 를 통해 유효성 검사 요약이 명시 적으로 숨겨져 있지 않은지 확인해야합니다 .

.validation-summary-valid {
    display: none;
}

@Html.ValidationSummary요약이 validation-summary-valid클래스 와 함께 동적으로 렌더링 되므로 이로 인해 가 표시되지 않을 수도 있습니다 .



-4

가장 낮은 부분과보기에 추가하십시오 :

@section 스크립트 {@ Scripts.Render ( "~ / bundles / jqueryval")}

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