首页 文章

ASP.NET MVC Html.ValidationSummary(true)不显示模型错误

提问于
浏览
178

我有一些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)%>
<% } %>

7 回答

  • 0

    我相信ValidationSummary标志的工作方式是它只显示 string.empty 的ModelErrors作为键 . 否则,假设它是属性错误 . 没有验证您提供的字符串是/不是模型上的属性 .

    ModelState.AddModelError(string.Empty, ex.Message);
    
  • -4

    这样做效果更好,因为您可以显示指定键的validationMessage:

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

    并显示如下:

    @Html.ValidationMessage("keyName")
    
  • 309

    我知道这有点陈旧,已被标记为147票的答案,但还有其他一些需要考虑 .

    如果需要,您可以在ValidationSummary中显示所有模型错误,名为property和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);
    

    enter image description here

  • 59

    也许是这样的:

    [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>
    
  • 6

    在我的情况下,由于返回,它无法正常工作 .

    而不是使用:

    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"); 必须与模型一起使用 .

    这个答案说明了原因 . Adding validation with DataAnnotations

  • 0

    如果几乎所有事情看起来都是正确的,另外需要注意的是确保通过某些 CSS 覆盖显式隐藏验证摘要,如下所示:

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

    这也可能导致 @Html.ValidationSummary 显示为隐藏,因为摘要是使用 validation-summary-valid 类动态呈现的 .

  • 28

    在视图的最下部添加它:

    @section Scripts {@ Scripts.Render(“〜/ bundles / jqueryval”)}

相关问题