【问题标题】:asp.net MVC - ValidationSummary not displayingasp.net MVC - ValidationSummary 不显示
【发布时间】:2010-10-07 10:51:47
【问题描述】:

我有一个奇怪的问题,即没有显示 ValidationSummary。但是,正在显示 ValidationMessage。我已经检查了输出页面的源代码,但并不是它们的颜色会掩盖它们。我正在使用RC。有什么想法吗?

编辑: ValidationSummary 处设置的断点显示:

ViewData.ModelState.Values[1].ErrorMessage = ""
ViewData.ModelState.Values[1].Exception.InnerException.Message = "4a is not a valid value for Int32"

ValidationSummary 使用 ErrorMessage 和 ValidationMessage 使用 InnerException.Message 吗?

我的查看代码是:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<App.Models.PurchaseOrdersView>" %>


<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
    <title>Edit</title>
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <h2>Edit</h2>

    <%= Html.ValidationSummary() %>

    <% Html.BeginForm("Edit", "PurchaseOrder", FormMethod.Post); %>
    <table>
        <tr>
            <td>
                Purchase Order Id:
            </td>
            <td>
                <%= Html.TextBox("PurchaseOrderId", Model.PurchaseOrderId)%>
                <%= Html.ValidationMessage("PurchaseOrderId")%>
            </td>
        </tr>
        <tr>
            <td>
                Date:
            </td>
            <td>
                <%= Html.TextBox("Date", Model.Date.ToString("dd-MMM-yyyy"))%>
                <%= Html.ValidationMessage("Date")%>
            </td>
        </tr>
    </table>
    <input type="submit" value="Save" />

    <% Html.EndForm(); %>

</asp:Content>

【问题讨论】:

    标签: .net asp.net-mvc validation


    【解决方案1】:

    您没有说没有显示的错误是什么,但是有一些错误将显示在 ValidationMessage 中但不会显示在 ValidationSummary 中。我认为这是候选版本中的一个错误,但我对其他解释持开放态度。特别是,请考虑 ValidationSummary 源代码中的这一行:

    string errorText = GetUserErrorMessageOrDefault(modelError, null /* modelState */);
    

    请注意,没有为 modelState 传递任何内容。现在将其与 ValidationMessage 进行对比:

    ... GetUserErrorMessageOrDefault(modelError, modelState) ...
    

    最后,我们来看看GetUserErrorMessageOrDefault:

        private static string GetUserErrorMessageOrDefault(ModelError error, ModelState modelState) {
            if (!String.IsNullOrEmpty(error.ErrorMessage)) {
                return error.ErrorMessage;
            }
            if (modelState == null) {
                return null;
            }
    
            string attemptedValue = (modelState.Value != null) ? modelState.Value.AttemptedValue : null;
            return String.Format(CultureInfo.CurrentCulture, MvcResources.Common_ValueNotValidForProperty, attemptedValue);
        }
    

    这告诉我们的是,如果您在向模型状态添加错误时指定自定义错误消息,它将被显示。但是,如果添加了一个异常(AddModelError 有一个重载接受异常,另一个重载接受一个字符串;实现 IDataErrorInfo 的工作方式类似于字符串大小写),而不是字符串错误消息,只有在 modelState 为非空,然后我们会给你一个通用消息而不是异常的错误消息。

    更新

    ValidationSummary 使用 ErrorMessage 和 ValidationMessage 使用 InnerException.Message 吗?

    是的,或多或少是这样的效果。就像我说的,我认为这是一个错误。

    更新2

    Microsoft 更新了 GetUserErrorMessageOrDefault 函数,如 here 所示。

    private static string GetUserErrorMessageOrDefault(HttpContextBase httpContext, ModelError error, ModelState modelState)
        {
            if (!String.IsNullOrEmpty(error.ErrorMessage))
            {
                return error.ErrorMessage;
            }
            if (modelState == null)
            {
                return null;
            }
    
            string attemptedValue = (modelState.Value != null) ? modelState.Value.AttemptedValue : null;
            return String.Format(CultureInfo.CurrentCulture, GetInvalidPropertyValueResource(httpContext), attemptedValue);
        }
    

    【讨论】:

    • 嗨 Craig:对于 PurchaseOrderId(整数)和 Date(日期),我输入了字符串。我尝试使用/不使用自定义错误消息。我使用 UpdateModel 来获取添加错误。我是n00b,我只是了解你在说什么。我用更多信息更新了我的问题。
    • 您好我也认为这是一个错误,因为我的验证摘要没有显示所有错误,但我的内联验证消息是。我认为这个错误是在 MVC2 RC2 中引入的。
    • 链接 Microsoft 对 GetUserErrorMessageOrDefault 的更改似乎已损坏。此链接应该有效:aspnetwebstack.codeplex.com/SourceControl/changeset/view/…
    【解决方案2】:

    试试

    <%= Html.ValidationSummary(false) %>
    

    【讨论】:

    • 参数为“excludePropertyErrors”。因此,将此设置为 false 可确保将属性错误包含在摘要中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    相关资源
    最近更新 更多