2012-01-18 13 views
19

Moja aplikacja jest setted z kulturą PT-BR (data jest dd-mm-rrrr) w pliku web.config:Podjęcie DateTime do kontrolera za pośrednictwem adresu URL powodującego błąd w ASP.NET MVC 3 (kultura)

<globalization enableClientBasedCulture="false" requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="iso-8859-15" responseHeaderEncoding="utf-8" resourceProviderFactoryType="string" enableBestFitResponseEncoding="true" culture="pt-BR" uiCulture="pt-BR" /> 

Wszystko DateTime stworzony w moim systemie jest w formacie prawej, ale stworzył metodę kontrolera tak:

public ActionResult Test(DateTime date) 
{ 
} 

Wywołanie tej metody bezpośredniej w przeglądarce przechodzi NULL gdy data jest w formacie Portugalski-BR, podobnie jak :

mysite/Test/?date=19/01/2012 => date = null in my controller 

mysite/Test/?date=01/01/2012 => date is fine, but in US format (mm-dd-yyyy) 

Jak mogę to naprawić, aby zaakceptować mój format daty?

Odpowiedz

51

Nie ma haczyka z domyślnego modelu spoiwa, które nie jest łatwo wiedzieć, ale kiedy już to wiem, że już nie popełnić tego samego błędu:

  • Podczas korzystania z żądania POST, spoiwo domyślnego modelu wykorzystuje ustawienia kulturowe do analizowania dat.

  • Podczas korzystania z żądania GET, domyślny segregator modelu używa CultureInfo.InvariantCulture do analizowania dat i ignoruje bieżące ustawienia kultury.

Ponieważ używasz żądania GET i przechodzącej datę jako parametr ciąg kwerendy, należy ją sformatować przy użyciu formatu kultury niezmienna podczas wysyłania go w adresie URL. Poprawnym sposobem sformatowania daty jako parametru ciągu zapytania jest yyyy-MM-dd.

Możesz rzucić okiem na following blog post, który dostaje więcej szczegółów.

+1

Jeśli zaimplementujesz niestandardowy segregator, pamiętaj o zarejestrowaniu go w programie DateTime? także, nie tylko DateTime. – Justin

+0

Witaj, Darin. Napotkałem ten sam problem co oryginalny wpis, a Twoja odpowiedź i cytowany artykuł pomogły mi zrozumieć problem, ale nie mogę jeszcze uzyskać odpowiedzi. Pracuję nad ASP.NET Core 2.0, ale nie wiem, jak zastosować zalecenia w tym artykule. Mam nadzieję, że możesz rzucić okiem na to pytanie: https://stackoverflow.com/questions/47442368/routing-datetime-parameter-passing-as-null-empty –

2

Jednym z podejść byłoby przyjęcie daty jako napisu, a następnie manipulowanie nią w kontrolerze do prawidłowego ustawienia/kultury.

8

Jako ktoś, kto dużo pracuje w firmach amerykańskich, miałem duże doświadczenie z problemami z datą.

Moja najlepsza rada to wybrać jednoznaczny format podczas transmisji.

dd-MMM-yyyy 

i

yyyy-MM-dd 

zakłady są bezpieczne i zostaną pomyślnie analizowany przez DateTime.Parse (obj).

Jeśli zmiana formatu daty nie jest możliwa, należy spojrzeć na numer DateTime.ParseExact, który umożliwia określenie dokładnego ciągu formatów, po którym następuje.

0

Wystąpił ten sam problem, używając widoku @Html.Action(..).W takiej sytuacji może być rozwiązany przez umieszczenie DateTime w modelu

public class MyModel 
{ 
    public DateTime Value {get;set;} 
} 

w widoku:

@Html.Action("MyAction", new { myModel }) 

Zanotować new { } po wystąpieniu MyModel ten sposób DateTime nie jest przekształcany na ciąg. To rozwiązanie działa tylko dla Html.Action() i dla Html.ActionLink() lub Url.Action(), ponieważ MVC wykonuje adres URL w postaci myModel.ToString().

Powiązane problemy