asp.net MVC - ValidationSummary不显示

时间:2009-02-13 13:36:04

标签: .net asp.net-mvc validation

我有一个奇怪的问题,即没有显示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>

2 个答案:

答案 0 :(得分:11)

尝试

<%= Html.ValidationSummary(false) %>

答案 1 :(得分:6)

您没有说明哪些错误没有显示,但有些错误会在ValidationMessage中显示,但在ValidationSummary中不会显示。我认为这是Release Candidate中的一个错误,但我对其他解释持开放态度。特别是,请考虑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是非null,然后我们将为您提供通用消息,而不是异常上的错误消息。

<强>更新

  

ValidationSummary是否使用ErrorMessage并且ValidationMessage使用InnerException.Message?

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

<强> UPDATE2

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);
    }