我有一个奇怪的问题,其中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>
解决方法
你不说什么错误是不显示,但有一些错误将显示在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为非空,然后我们给你一个通用消息,而不是异常的错误消息.
更新
Does ValidationSummary use ErrorMessage and ValidationMessage use InnerException.Message?
是的,这或多或少的效果.就像我说的,我觉得这是一个bug.
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); }