[asp.net-mvc]asp.net MVC-ValidationSummary 不显示

标签: Asp.net-MVC .Net
发布时间: 2017/3/25 10:24:31
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有一个奇怪的问题,藉以 ValidationSummary 不被显示。但是,ValidationMessage 会被显示。我查过输出页面源代码,它是不是说他们都遮蔽他们的颜色。我使用的钢筋混凝土。有什么想法?

编辑︰ 断点设置在 ValidationSummary 所示︰

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

是否 ValidationSummary 使用错误信息和 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>

解决方法 1:

你不要说错误是什么,不能显示,但也有一些错误将显示在 ValidationMessage 中但不是在 ValidationSummary。我认为这是候选发布中的一个 bug,可是打开其他的解释。尤其是,考虑这条线从 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 使用错误信息和 ValidationMessage 使用 InnerException.Message?

是的是更多或更少的效果。就像我说的我认为这是一个 bug。

Update2

微软更新 GetUserErrorMessageOrDefault 函数作为见这里

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);
    }
赞助商