2009-02-13 5 views
9

J'ai un problème étrange par lequel le ValidationSummary n'est pas affiché. Cependant, les ValidationMessage sont affichés. J'ai vérifié la source de la page de sortie et ce n'est pas comme si elles étaient dans une couleur qui les obscurcit. J'utilise le RC. Des idées?asp.net MVC - ValidationSummary n'affiche pas

Edit: point de rupture fixé à ValidationSummary montre:

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

Est-ce que ValidationSummary utilise ErrorMessage et ValidationMessage utilisent InnerException.Message?

Mon code de vue est:

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

Répondre

6

Vous ne dites pas ce que les erreurs sont que ne diffusons pas, mais il y a des erreurs qui seront affichées dans ValidationMessage mais pas dans ValidationSummary. Je pense que c'est un bug dans le Release Candidate, mais je suis ouvert à d'autres interprétations. En particulier, considérer cette ligne à partir du code source ValidationSummary:

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

Notez que rien ne se passe pour ModelState. Maintenant, qui contraste avec ValidationMessage:

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

Enfin, regardons 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); 
    } 

Ce que cela nous dit est que si vous spécifiez un message d'erreur personnalisé lorsque vous ajoutez une erreur à l'état de modèle, il sera affiché. Si, toutefois, une exception est ajoutée (il y a une surcharge pour AddModelError qui prend une exception, une autre qui prend une chaîne, implémentant IDataErrorInfo fonctionne comme la chaîne), au lieu d'un message d'erreur chaîne, elle sera seulement affichée si modelState est non-null, et nous vous donnerons un message générique à la place du message d'erreur sur l'exception.

Mise à jour

Est-ce que ValidationSummary utiliser ErrorMessage et ValidationMessage utilisent InnerException.Message?

Oui, c'est plus ou moins l'effet. Comme je l'ai dit, je pense que c'est un bug.

Update2

Microsoft a mis à jour la fonction GetUserErrorMessageOrDefault comme on le voit 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

Salut Craig: Pour PurchaseOrderID (entier) et la date (date) je suis entré dans les chaînes. J'ai essayé avec/sans messages d'erreur personnalisés. J'utilise UpdateModel pour obtenir des erreurs supplémentaires. Je suis un n00b et je suis à peu près au courant de ce que vous dites. J'ai mis à jour ma question avec un peu plus d'infos. –

+0

Salut, je pense aussi que c'est un bug car mon résumé de validation n'affiche pas toutes les erreurs mais mes messages de validation en ligne le sont. Je pense que ce bug a été introduit dans MVC2 RC2. – Naz

+1

Le lien que Microsoft a modifié pour GetUserErrorMessageOrDefault semble être rompu. Ce lien devrait fonctionner: http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/f1511797ea32#src/System.Web.Mvc/Html/ValidationExtensions.cs – Jay

11

Essayez

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

Le paramètre est "excludePropertyErrors". La définition de cette valeur sur false garantit que les erreurs de propriété sont incluses dans le récapitulatif. – AaronLS

Questions connexes