asp.net MVC - ValidationSummary不显示

Ala*_*n T 9 .net validation asp.net-mvc

我有一个奇怪的问题,即ValidationSummary没有显示.但是,正在显示ValidationMessage.我检查了输出页面源,并不是说它们的颜色模糊了它们.我正在使用RC.有任何想法吗?

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

ViewData.ModelState.Values[1].ErrorMessage = ""
ViewData.ModelState.Values[1].Exception.InnerException.Message = "4a is not a valid value for Int32"
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

小智 11

尝试

<%= Html.ValidationSummary(false) %>
Run Code Online (Sandbox Code Playgroud)

  • 参数是"excludePropertyErrors".因此将此设置为false可确保摘要中包含属性错误. (2认同)

Cra*_*ntz 6

您没有说明哪些错误没有显示,但有些错误将显示在ValidationMessage中,但不会显示在ValidationSummary中.我认为这是Release Candidate中的一个错误,但我对其他解释持开放态度.特别是,请考虑ValidationSummary源代码中的这一行:

string errorText = GetUserErrorMessageOrDefault(modelError, null /* modelState */);
Run Code Online (Sandbox Code Playgroud)

请注意,没有为modelState传递任何内容.现在与ValidationMessage形成对比:

... GetUserErrorMessageOrDefault(modelError, modelState) ...
Run Code Online (Sandbox Code Playgroud)

最后,让我们看一下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);
    }
Run Code Online (Sandbox Code Playgroud)

这告诉我们的是,如果在向模型状态添加错误时指定自定义错误消息,则会显示该错误消息.但是,如果添加了一个异常(AddModelError有一个带有异常的重载,另一个带有字符串的重载;实现IDataErrorInfo就像字符串情况一样),而不是字符串错误消息,只有当modelState是非null,然后我们将为您提供一个通用消息,而不是异常上的错误消息.

更新

ValidationSummary是否使用ErrorMessage和ValidationMessage使用InnerException.Message?

是的,这或多或少都是影响.就像我说的,我认为这是一个错误.

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);
    }
Run Code Online (Sandbox Code Playgroud)