2009-02-13 134 views
9

我有一个奇怪的问题,其中没有显示ValidationSummary。但是,正在显示ValidationMessage。我已经检查了输出页面的源代码,并且不像它们以一种使它们模糊的颜色。我正在使用RC。有任何想法吗?asp.net MVC - ValidationSummary不显示

编辑:设定的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为非null,然后我们给你一个通用的消息,而不是异常的错误消息。

更新

确实的ValidationSummary使用的ErrorMessage和ValidationMessage使用InnerException.Message?

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

UPDATE2

微软更新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

嗨克雷格:对于PurchaseOrderId(整数)和日期(日期)我输入的字符串。我试着用/不用自定义错误信息。我使用UpdateModel来获取添加错误。我是一个nb,我只是想知道你在说什么。我已经用更多信息更新了我的问题。 – 2009-02-13 14:36:27

+0

嗨我也认为这是一个错误,因为我的验证总结不显示所有的错误,但我的在线验证信息。我认为这个错误是在MVC2 RC2中引入的。 – Naz 2010-02-23 12:33:36

11

尝试

<%= Html.ValidationSummary(false) %>