2012-11-19 11 views
9

Próbuję zbudować walidator, który będzie działać z DefaultModelBinder .NET przy użyciu DateTime.Parse, aby przekonwertować ciąg z postu formularza na DateTime. Nie chcę czekać, aż na serwer zostanie wysłana data, aby zdał sobie sprawę, że była to zła data.JavaScript równoważne z .NET's DateTime.Parse

Obecnie jquery.validate wykorzystuje następujący kod do sprawdzania poprawności daty pola:

// http://docs.jquery.com/Plugins/Validation/Methods/date 
date: function(value, element) { 
    return this.optional(element) || !/Invalid|NaN/.test(new Date(value)); 
} 

Jednakże ze względu na funkcje Javascript straszne Data parser, to:

275481/69/100089

Zostanie oceniony jako ważny, do 12 września 275760.

Chociaż z drugiej strony, to:

11-19-2013

oceni jako nieprawidłowej.

Oczywiście, rozumiem, że C# 's DateTime.Parse() wykonuje takie rzeczy jak kultury (lokalizacja) i roku przestępnym pod uwagę, a ja mogłem żyć z zakładając stałą (US) kultury i umożliwiając „02-29-2013 "na kliencie i wyrzuć go na serwer (najlepiej nie, ale jest to dopuszczalne).

Ale nie mogę uwierzyć, że ktoś nie utworzył walidatora lepszej daty do pracy z logiką DateTime.Parse (C#).

Może ktoś ma, ja po prostu go nie znalazłem - dlatego zamieszczam tutaj.

Wiem, że mam na to kilka sposobów - od niewiarygodnie prostych (mniej dokładnych) po niewiarygodnie złożone (dokładniejsze), ale mam nadzieję, że ktoś już przeszedł tę drogę i znalazł to słodkie miejsce.

+4

DateJS może być właściwe tutaj, ale wprawdzie, nawet wtedy nie jest idealnie. http://www.datejs.com/ –

+1

regularne wyrażenia? –

+0

@GrantH. Myślałem o date.js, ale jak powiedziałeś, wygląda na to, że ma swoje wady. To może być sposób, w jaki pójdę - prawdopodobnie w kombinacji w wyrażeniach regularnych - jeśli nie otrzymam lepszych sugestii tutaj. –

Odpowiedz

5

Datejs wydaje mi się całkiem niezła. Jego parse funkcja obsługuje ponad 150 kultur:

Date.parse("February 20th 1973") 

A w przypadku trzeba analizować ciąg daty, który nie jest ważny w obecnej kulturze można użyć parseExact funkcję:

// The Date of 15-Oct-2004 
Date.parseExact("10/15/2004", ["M/d/yyyy", "MMMM d, yyyy"]); 
1

zamiast próbować znaleźć dwie implementacje DateTime (jeden dla JS i inny dla C#), które mają podobną walidacji i analizowania, Czy za posiadanie klienta 1) wykorzystać swoje własna biblioteka do sprawdzania daty i 2) analizować i ponownie formatować datę do formatu przyjaznego dla C#?

To pozwala na użycie DateJS, aby uzyskać bardzo elastyczny front-end dla danych wejściowych, ułatwić sobie radzenie sobie z kulturą po stronie klienta i pozwolić stronie serwera na stały format.

2

Szczerze mówiąc, najlepiej jest wykonać trafienie AJAX i poprosić serwer WWW ASP.net, aby przeanalizował ciąg znaków i zwrócił datę JavaScript.

Biblioteki JavaScript łatwo można pomylić z różnymi lokalizacjami, np.:

GET /ParseDate.ashx?dateStaring=06/01/34 4:53:05 غ.و&locale=ar-SA 

który dostaje bardzo skomplikowane, ponieważ:

"6/1/34" = November 19, 2012 

.NET Framework, Windows za nim, posiada wsparcie dla wielu różnych lokalizacjach.

Powiązane problemy