6

Znalazłem wiele pytań symulacyjnych, ale nie było to dobre, czyste rozwiązanie, które działa. Widzę wiele niestandardowego kodu, aby to zadziałało, ale dlaczego tak jest? Czy to nie działa od początku?Walidacja sprawdzania poprawności DataTime MVC

To, co uważam za dziwne, to to, że w IE9 działa, ale w Firefoksie i Chrome to nie działa. Za każdym razem, gdy próbuję w Firefoksie lub Chrome, pojawia się komunikat "Pole Urodziny musi być datą".

Kiedy próbuję kodu poniżej w nowym projekcie MVC 4 RTM, nie mogę go uruchomić. Widzę DateTime.Now domyślnie jako dd-MM-rrrr (Holandia) we wszystkich przeglądarkach, ale nie mogę go przesłać w Firefoksie i Chrome.

Znacznik globalizacji nie jest ustawiony w pliku web.config, więc musi używać wartości domyślnej. Jestem z Holandii, więc powinienem zdobyć kulturę klienta.

public class RegisterModel 
{ 
    [Required] 
    [Display(Name = "User name")] 
    public string UserName { get; set; } 

    [Required] 
    [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)] 
    //[DataType(DataType.Date)] 
    public DateTime Birthday { get; set; } 
} 

[AllowAnonymous] 
    public ActionResult Register() 
    { 
     RegisterModel vm = new RegisterModel() 
     { 
      Birthday = DateTime.Now 
     }; 
     return View(vm); 
    } 

    [HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public ActionResult Register(RegisterModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      // Attempt to register the user 
      try 
      { 
       //WebSecurity.CreateUserAndAccount(model.UserName, model.Password); 
       //WebSecurity.Login(model.UserName, model.Password); 
       return RedirectToAction("Index", "Home"); 
      } 
      catch (MembershipCreateUserException e) 
      { 
       ModelState.AddModelError("", ErrorCodeToString(e.StatusCode)); 
      } 
     } 

     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

Markup

<!-- language: lang-none --> 
@model DateTimeWithDatePicker.Models.RegisterModel 
@{ 
    ViewBag.Title = "Register"; 
} 

<hgroup class="title"> 
    <h1>@ViewBag.Title.</h1> 
    <h2>Create a new account.</h2> 
</hgroup> 

@using (Html.BeginForm()) { 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary() 

    <fieldset> 
     <legend>Registration Form</legend> 
     <ol> 
      <li> 
       @Html.LabelFor(m => m.UserName) 
       @Html.TextBoxFor(m => m.UserName) 
      </li> 
      <li> 
       @Html.LabelFor(m => m.Birthday) 
       @Html.EditorFor(m => m.Birthday) 
      </li> 
     </ol> 
     <input type="submit" value="Register" /> 
    </fieldset> 
} 

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 
+0

Niestety, ale nie wiem, jak sformatować MVC widok powyżej. –

Odpowiedz

3

Problemem było walidacji jQuery i lokalizacja . Wygląda na to, że istnieją pliki lokalizacyjne dla wiadomości i metod wtyczki jQuery. Zobacz mojego bloga, aby szczegółowo wyjaśnić problem i jak go rozwiązać.

http://www.locktar.nl/programming/mvc/localization-validation-in-mvc/

Edit: Właśnie ukazał się nowy wpis na blogu o odświeżeniu wszystkich problemów lokalizacyjnych i jak go naprawić za nieruchomości DateTime. Zobacz mój nowy wpis MVC localization validation.

+0

Użyłem http://ajax.aspnetcdn.com/ajax/jquery.validate/1.7/localization/methods_nl.js, znalazłem następujący link. To działało dobrze w IE i Firefox, ale nie w Chrome. Chrome obsługuje wprowadzanie danych w formacie html5 i przechowuje wartość w formacie "rrrr-mm-dd". Zmieniłem test na: if (Modernizr.inputtypes.date) { return true; } else {} –

+0

Czy zmieniono 1.7 do najnowszej wersji? To jakiś czas temu napisałem ten blog. Właśnie uruchomiłem moją nową stronę blogu na www.locktar.nl. –

1

Znacznik globalizacja nie jest ustawiony w pliku web.config więc musi być przy użyciu domyślnego . Jestem z Holandii, więc powinienem zdobyć kulturę klienta.

Nie, to nie jest poprawne. Możesz być doskonale z Holandii i skonfigurować przeglądarkę, aby używać chińskiej kultury. Powodem, dla którego nie możesz tego zrobić, jest prawdopodobnie to, że w FF i Chrome nie masz odpowiedniej kultury.

Ponieważ nie zdefiniowano kultury w elemencie globalizacji w pliku web.config, ASP.NET MVC użyje tej, która została wysłana z przeglądarki w nagłówku żądania. Na przykład, jeśli skonfigurować przeglądarkę do en-US kultura następujący nagłówek zostanie ustawiona wzdłuż każdej życzenie:

Accept-Language:en-US,en;q=0.8 

Oto jak to jest skonfigurowany w Chrome:

enter image description here

więc upewnij się, Najpierw umieść wybrany język na liście.

A jeśli chcesz niezawodną drogę do korzystania z tej samej składni, jak zdefiniowany w atrybucie DisplayFormat podczas wiązania można napisać spinacza modelu niestandardowych modeli, jak pokazano poniżej: https://stackoverflow.com/a/7836093/29407

+0

Moja kultura była dobra w firefoxie i chrome, więc to nie był problem. Problemem była walidacja jQuery, która nie działała w Firefoksie i Chrome tak samo jak w Internet Explorerze. Zobacz odpowiedź tego wpisu, a mój blog idzie w szczegóły. –

7

udało mi się rozwiązać ten problem poprzez modyfikację funkcji sprawdzania poprawności jQuery dla terminach:

<script type="text/javascript"> 

    $(function() { 

    var dateFormat="dd/mm/yy"; // en-gb date format, substitute your own 

    $("#Birthday").datepicker({ 
     "dateFormat": dateFormat 
    }); 

    jQuery.validator.addMethod(
     'date', 
     function (value, element, params) { 
      if (this.optional(element)) { 
       return true; 
      }; 
      var result = false; 
      try { 
       $.datepicker.parseDate(dateFormat, value); 
       result = true; 
      } catch (err) { 
       result = false; 
      } 
      return result; 
     }, 
     '' 
    ); 

}); 

+0

Zobacz moją odpowiedź na mój własny temat. Zrobiłem blog na ten temat http://stackoverflow.com/a/12346915/801005 –

+1

Próbowałem twój blog, gdy próbuję rozwiązać ten problem. Jestem pewien, że jest to najlepsze rozwiązanie, gdy chcesz uzyskać rozstrzygające rozwiązanie dla wielu użytkowników w różnych krajach. Ale powyższy skrypt jest odpowiedni, gdy potrzebujesz dwuminutowego rozwiązania i nie zależy Ci na lokalizacji dla wielu użytkowników z różnych krajów. – gls123