2010-05-17 8 views
6

Mam małą aplikację MVC2 wyświetlaną w dwóch kulturach: en-US i es-MX. Jedna porcja zawiera dane wejściowe użytkownika dla daty wstępnie wypełnionej bieżącą datą w modelu.Sprawdzanie poprawności modelu ASP.NET MVC2 nie działa w formacie daty innej niż amerykańska

Podczas korzystania z en-US pole daty jest wyświetlane jako MM/dd/rrrr i można je zmienić w tym samym formacie bez powodowania błędów sprawdzania poprawności.

Podczas korzystania ES-MX, pole data jest wyświetlana jako dd/mm/rrrr, ale gdy data jest edytowany w tym formacie, walidację po stronie serwera nie powiedzie się z komunikatem:

Wartość "17/05/1991" nie jest ważne dla daty.

Jedną z pierwszych rzeczy, które wyskakuje na mnie o tej wiadomości jest to, że nie jest zlokalizowane. Zarówno sama wiadomość (której nie uważam za możliwą do kontrolowania), jak i wyświetlana nazwa pola (którą mogę kontrolować i jest zlokalizowana w moim kodzie). Powinien być wyświetlany w zlokalizowanym formacie.

Próbowałem przejść przez kod, aby zobaczyć dokładnie, gdzie walidacja się nie udaje, ale wydaje się, że dzieje się to w obrębie niektórych skompilowanych kodów MVC lub DataAnnotations, których nie widzę.

Nakładanie: IIS6, ASP.NET 3.5 (C#), MVC 2 RTM

Przykładowy model Kod:

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

Przykładowy Kontroler Akcja Kod:

[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 View Code :

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

Odpowiedz

2

Oto jak rozwiązać ten problem w moim przypadku. Ręcznie sprawdziłem datę w kontrolerze i zresetowałem model Stan dla tej właściwości:

[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); 
    } 
Powiązane problemy