2009-02-13 20 views
9

Tengo un problema extraño por el cual no se muestra el ValidationSummary. Sin embargo, se muestran los ValidationMessage. He comprobado el origen de la página de salida y no es como si estuvieran en un color que los está ocultando. Estoy usando el RC. ¿Algunas ideas?asp.net MVC - ValidaciónSummary que no muestra

Editar: punto de rotura establecido en ValidationSummary muestra:

ViewData.ModelState.Values[1].ErrorMessage = "" 
ViewData.ModelState.Values[1].Exception.InnerException.Message = "4a is not a valid value for Int32" 

¿El ValidationSummary utilizar ErrorMessage y ValidationMessage utilizan InnerException.Message?

Mi código de la vista es:

<%@ 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> 

Respuesta

6

Usted no dice lo que los errores son que no se muestran, pero hay algunos errores que se mostrarán en ValidationMessage pero no en ValidationSummary. Creo que esto es un error en Release Candidate, pero estoy abierto a otras interpretaciones. En particular, considere esta línea a partir del código fuente ValidationSummary:

string errorText = GetUserErrorMessageOrDefault(modelError, null /* modelState */); 

Tenga en cuenta que nada se pasa por ModelState. Ahora contrastarlo con ValidationMessage:

... GetUserErrorMessageOrDefault(modelError, modelState) ... 

Por último, vamos a ver 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); 
    } 

Lo que esto nos dice es que si se especifica un mensaje de error personalizado cuando se agrega un error en el modelo de estado, se mostrará. Sin embargo, si se agrega una excepción (hay una sobrecarga para AddModelError que toma una excepción, otra que toma una cadena; implementar IDataErrorInfo funciona como el caso de cadena), en lugar de un mensaje de error de cadena, solo se mostrará si modelState es no nulo, y luego le daremos un mensaje genérico en lugar del mensaje de error en la excepción.

actualización

¿El uso ValidationSummary ErrorMessage y ValidationMessage utilizan InnerException.Message?

Sí, eso es más o menos el efecto. Como dije, creo que esto es un error.

Update2

Microsoft actualiza la función GetUserErrorMessageOrDefault como se ve 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

Hola Craig: Para PurchaseOrderId (entero) y fecha (fecha) entré cuerdas. Intenté con/sin mensajes de error personalizados. Uso UpdateModel para obtener errores de adición. Soy un n00b y casi entiendo lo que dices. He actualizado mi pregunta con un poco más de información. –

+0

Hola, también creo que esto es un error, ya que mi resumen de validación no muestra todos los errores, pero sí mis mensajes de validación en línea. Creo que este error se introdujo en MVC2 RC2. – Naz

+1

El vínculo El cambio de Microsoft a GetUserErrorMessageOrDefault parece estar roto. Este enlace debería funcionar: http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/f1511797ea32#src/System.Web.Mvc/Html/ValidationExtensions.cs – Jay

11

Trate

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

El parámetro es "excludePropertyErrors". Por lo tanto, configurar esto en falso garantiza que los errores de propiedad se incluyan en el resumen. – AaronLS

Cuestiones relacionadas