2010-05-17 3 views
6

Ich habe eine kleine MVC2-App, die in zwei Kulturen angezeigt wird: en-US und es-MX. Ein Teil enthält eine Benutzereingabe für ein Datum, das im Modell bereits mit dem aktuellen Datum ausgefüllt ist.ASP.NET MVC2-Modellvalidierung schlägt mit nicht-US-Datumsformat fehl

Bei Verwendung von en-US wird das Datumsfeld als MM/TT/JJJJ angezeigt und kann im selben Format geändert werden, ohne dass Validierungsfehler auftreten.

Wenn es-MX verwendet, wird das Datumsfeld als TT/MM/JJJJ angezeigt, aber wenn das Datum in diesem Format bearbeitet wird, schlägt die serverseitige Validierung mit der Meldung:

Der Wert "17/05/1991" gilt nicht für das Datum.

Eines der ersten Dinge, die mich über diese Nachricht herausspringt, ist, dass es nicht lokalisiert ist. Sowohl die Nachricht selbst (die ich nicht kontrollieren kann) als auch den Anzeigenamen des Feldes (das ich steuern kann und in meinem Code lokalisiert ist). Sollte in einem lokalisierten Format angezeigt werden.

Ich habe versucht, durch den Code zu gehen, um genau zu sehen, wo die Validierung fehlschlägt, aber es scheint in einigen der kompilierten MVC oder DataAnnotations Code passiert, die ich nicht sehen kann.

Anwendungsdetails: IIS6, ASP.NET 3.5 (C#), 2 MVC RTM

Beispielmodell Code:

public class TestVieModel{ 
    [LocalizedDisplayNameDisplayName("TheDateDisplayName", NameResourceType=typeof(Resources.Model.TestViewModel))] 
    [Required(ErrorMessageResourceName="TheDateValidationMessageRequired", ErrorMessageResourceType=typeof(Resources.Model.TestViewModel))] 
    [DataType(DataType.Date)] 
    public DateTime TheDate { get; set; } 
} 

Aktion Codebeispiel Controller:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Save(TestViewModel model) { 
    if(ModelState.IsValid) { // <--- Always is false when using es-MX and a date foramtted as dd/MM/yyyy. 
     // Do other stuff 
     return this.View("Complete", model); 
    } 

    // Validation failed, redisplay the form. 
    return this.View("Enter", model); 
} 

Beispiel Code anzeigen :

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<HispanicSweeps.Web.Model.LosMets.EnterViewModel>" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" > 
    <head runat="server"> 
     <title>Test</title> 
    </head> 
    <body> 
     <% using (Html.BeginForm()) {%> 
      <%= Html.ValidationSummary(true) %> 

      <fieldset> 
       <legend>Fields</legend> 
       <div class="editor-label"> 
        <%= Html.LabelFor(model => model.TheDate) %> 
       </div> 
       <div class="editor-field"> 
        <%= Html.EditorFor(model => model.TheDate) %> 
        <%= Html.ValidationMessageFor(model => model.TheDate) %> 
       </div> 

       <p><input type="submit" value="Save" /></p> 
      </fieldset> 

     <% } %> 
    </body> 
</html> 

Antwort

1

Die Validierung findet innerhalb der DataAnnotations-Klasse statt. Sie können DataAnnotations-Klassen für Ihre eigenen Zwecke ableiten.

Ich würde eine neue MultiCultureDateType DataAnnotations-Klasse erstellen, die Daten über mehrere Kulturen validieren wird.

Weitere Informationen: http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx

2

Hier ist, wie ich das Problem in meinem Fall gelöst. Ich habe das Datum in der Steuerung manuell validiert und den ModelState für diese Eigenschaft zurückgesetzt: