asp.net MVC - ValidationSummary не отображается - PullRequest
9 голосов
/ 13 февраля 2009

У меня странная проблема, из-за которой ValidationSummary не отображается. Тем не менее, ValidationMessage's отображаются. Я проверил источник выходной страницы, и это не так, как будто они в цвете, который скрывает их. Я использую RC. Есть идеи?

Edit: Точка останова, установленная в 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 ]

11 голосов
/ 27 сентября 2010

Попробуйте

<%= Html.ValidationSummary(false) %>
6 голосов
/ 13 февраля 2009

Вы не говорите, что это за ошибки, которые не отображаются, но есть некоторые ошибки, которые будут отображаться в 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 не нулевое, и тогда мы выдадим вам общее сообщение вместо сообщения об ошибке в исключении.

Обновление

Использует ли ValidationSummary ErrorMessage, а ValidationMessage - InnerException.Message?

Да, это более или менее эффект. Как я уже сказал, я думаю, что это ошибка.

Update2

Microsoft обновила функцию 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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...