2010-05-17 4 views
6

J'ai une petite application MVC2 qui s'affiche dans deux cultures: en-US et es-MX. Une partie contient une entrée utilisateur pour une date pré-remplie avec la date actuelle dans le modèle. Lorsque vous utilisez en-US, le champ de date s'affiche sous la forme MM/jj/aaaa et peut être modifié en utilisant le même format sans provoquer d'erreurs de validation.La validation du modèle ASP.NET MVC2 échoue avec le format de date non US

Lorsque vous utilisez es-MX, le champ de date est affichée comme jj/mm/aaaa, mais lorsque la date est édité dans ce format, la validation côté serveur échoue avec le message:

La valeur '17/05/1991 'n'est pas valable pour la date.

L'une des premières choses qui me saute aux yeux à propos de ce message est qu'il n'est pas localisé. Le message lui-même (que je ne pense pas pouvoir contrôler) et le nom d'affichage du champ (que je peux contrôler et localisé dans mon code). Doit être affiché dans un format localisé.

J'ai essayé de parcourir le code pour voir exactement où la validation échoue, mais il semble se passer dans certains des codes compilés MVC ou DataAnnotations que je ne peux pas voir.

Détails de l'application: IIS6, ASP.NET 3.5 (C#), MVC 2 RTM

Code de modèle Exemple:

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

Code Action Controller Exemple:

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

Sample Code Voir :

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

Répondre

2

Voici comment je résolu la question dans mon cas. J'ai manuellement validé la date dans le contrôleur et réinitialisé le ModelState pour cette propriété:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Save(TestViewModel model) { 

    var tempDate = new DateTime(); 
    var culture = CultureInfo.CurrentUICulture; 

    if(DateTime.TryParse(Request.Form["TheDate"], culture, DateTimeStyles.None, out tempDate)) { 
     model.DateOfBirth = tempDate; 
     ModelState.Remove("TheDate"); 
     } 

    if(ModelState.IsValid) { // <--- Now valid 
     // Do other stuff 
     return this.View("Complete", model); 
     } 

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