2009-02-13 20 views
9

Ho uno strano problema per cui ValidationSummary non viene visualizzato. Tuttavia, vengono visualizzati i ValidationMessage. Ho controllato l'origine della pagina di output e non è come se fossero in un colore che li oscura. Sto usando la RC. Qualche idea?asp.net MVC - ValidationSummary non visualizza

Edit: punto di rottura fissato a ValidationSummary mostra:

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

fa ValidationSummary utilizzare ErrorMessage e ValidationMessage usano InnerException.Message?

Il mio codice di vista è:

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

risposta

6

Tu non dici quello che gli errori sono che non vengono visualizzate, ma ci sono alcuni errori che verranno visualizzati in ValidationMessage ma non in ValidationSummary. Penso che questo sia un bug nel Release Candidate, ma sono aperto ad altre interpretazioni. In particolare, in considerazione questa riga dal codice sorgente ValidationSummary:

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

Nota che nulla viene fatto passare per ModelState. Ora Contrasto che con ValidationMessage:

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

Infine, diamo un'occhiata a 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); 
    } 

Che cosa questo ci dice è che se si specifica un messaggio di errore personalizzato quando si aggiunge un errore al modello di stato, sarà visualizzato. Se, tuttavia, viene aggiunta un'eccezione (c'è un sovraccarico per AddModelError che accetta un'eccezione, un altro che accetta una stringa, l'implementazione di IDataErrorInfo funziona come il caso stringa), invece di un messaggio di errore stringa, verrà visualizzato solo se modelState è non null, e quindi ti daremo un messaggio generico invece del messaggio di errore nell'eccezione.

Aggiornamento

fa ValidationSummary utilizzare ErrorMessage e ValidationMessage usano InnerException.Message?

Sì, questo è più o meno l'effetto. Come ho detto, penso che questo sia un bug.

Update2

Microsoft ha aggiornato la funzione GetUserErrorMessageOrDefault come visto 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

Hi Craig: Per PurchaseOrderID (intero) e data (data) sono entrato stringhe. Ho provato con/senza messaggi di errore personalizzati. Io uso UpdateModel per ottenere errori di aggiunta. Sono un n00b e mi limito a capire cosa stai dicendo. Ho aggiornato la mia domanda con qualche informazione in più. –

+0

Ciao, penso anche che questo sia un bug perché il mio riepilogo di convalida non mostra tutti gli errori ma i miei messaggi di convalida in linea sono. Penso che questo bug sia stato introdotto in MVC2 RC2. – Naz

+1

Il collegamento La modifica di Microsoft a GetUserErrorMessageOrDefault sembra essere interrotta. Questo collegamento dovrebbe funzionare: http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/f1511797ea32#src/System.Web.Mvc/Html/ValidationExtensions.cs – Jay

11

Prova

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

Il parametro è "excludePropertyErrors". Quindi, impostando su false si accerta che gli errori di proprietà siano inclusi nel riepilogo. – AaronLS

Problemi correlati