2009-02-13 6 views
9

Ich habe ein seltsames Problem, bei dem die ValidationSummary nicht angezeigt wird. Die ValidationMessage wird jedoch angezeigt. Ich habe die Ausgabeseitenquelle überprüft und es ist nicht so, als ob sie in einer Farbe sind, die sie verdeckt. Ich benutze die RC. Irgendwelche Ideen?asp.net MVC - ValidationSummary wird nicht angezeigt

Edit: Knickpunkt bei Validation gesetzt zeigt:

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

Does Validation verwenden Errormessage und Validation InnerException.Message verwenden?

Meine Ansicht Code ist:

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

Antwort

6

Sie sagen nicht, was die Fehler sind, die nicht angezeigt werden, aber es gibt einige Fehler, die in Validation angezeigt werden, aber nicht in Validation. Ich denke, das ist ein Bug im Release Candidate, aber ich bin offen für andere Interpretationen. Insbesondere betrachten diese Zeile aus dem Validation Quellcode:

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

Beachten Sie, dass nichts für Modelgeben wird. Jetzt Kontrast, der mit Validation:

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

Schließlich wollen wir bei GetUserErrorMessageOrDefault aussehen:

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); 
    } 

Was sagt uns, dass, wenn Sie eine benutzerdefinierte Fehlermeldung an, wenn Sie einen Fehler an den Modellzustand hinzufügen, Es wird angezeigt. Wenn jedoch eine Ausnahme hinzugefügt wird (es gibt eine Überladung für AddModelError, die eine Ausnahme akzeptiert, eine andere, die eine Zeichenfolge verwendet; die Implementierung von IDataErrorInfo funktioniert wie die Zeichenfolge case), wird sie nur angezeigt, wenn es sich bei modelState um eine Zeichenfolge-Fehlermeldung handelt Nicht-null, und dann geben wir Ihnen eine generische Nachricht anstelle der Fehlermeldung in der Ausnahme.

aktualisieren

Does Validation verwenden Errormessage und Validation InnerException.Message verwenden?

Ja, das ist mehr oder weniger der Effekt. Wie ich schon sagte, ich denke, das ist ein Fehler.

Update2

Microsoft die GetUserErrorMessageOrDefault Funktion aktualisiert here gesehen. Versuchen

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

Hallo Craig: Für PurchaseOrderId (integer) und Datum (Datum) I Strings eingegeben. Ich habe versucht mit/ohne benutzerdefinierte Fehlermeldungen. Ich verwende UpdateModel, um Fehler hinzuzufügen. Ich bin ein n00b und ich verstehe nur, was du sagst. Ich habe meine Frage mit ein bisschen mehr Info aktualisiert. –

+0

Hallo, ich denke auch, dass dies ein Fehler ist, da meine Validierungszusammenfassung nicht alle Fehler anzeigt, aber meine Inline-Validierungsnachrichten sind. Ich denke, dass dieser Fehler in MVC2 RC2 eingeführt wurde. – Naz

+1

Die Verknüpfung von Microsoft zu GetUserErrorMessageOrDefault scheint unterbrochen zu sein. Dieser Link sollte funktionieren: http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/f1511797ea32#src/System.Web.Mvc/Html/ValidationExtensions.cs – Jay

11

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

Der Parameter ist "excludePropertyErrors". Wenn Sie dies auf false festlegen, wird sichergestellt, dass Fehler in der Zusammenfassung enthalten sind. – AaronLS

Verwandte Themen