2009-02-13 3 views
9

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

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> 

ответ

6

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

Update

использовать ли 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); 
    } 
+0

Hi Craig: Для PurchaseOrderId (целое) и дата (дата) я вошел строк. Я пытался с помощью/без сообщений об ошибках. Я использую UpdateModel для получения ошибок. Я n00b, и я просто берусь за то, что вы говорите. Я обновил свой вопрос немного подробнее. –

+0

Привет, я также думаю, что это ошибка, так как мое резюме проверки не отображает все ошибки, но мои сообщения о проверке в строке. Я думаю, что эта ошибка была введена в MVC2 RC2. – Naz

+1

Ссылка, по которой происходит смена Microsoft на GetUserErrorMessageOrDefault, нарушена. Эта ссылка должна работать: http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/f1511797ea32#src/System.Web.Mvc/Html/ValidationExtensions.cs – Jay

11

Попробуйте

<%= Html.ValidationSummary(false) %> 
+2

Параметр «excludePropertyErrors». Таким образом, установка этого значения в false гарантирует, что ошибки свойств включены в сводку. – AaronLS