2012-01-18 14 views
19

La mia applicazione è settata con la cultura pt-BR (data è gg-mm-aaaa) nel web.config:Passare un DateTime al controllore tramite URL che causa l'errore in ASP .NET MVC 3 (cultura)

<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" /> 

Tutti DateTime creato sul mio sistema è in formato giusto, ma ho creato un metodo di controllo del genere:

public ActionResult Test(DateTime date) 
{ 
} 

chiamata che metodo diretto nel browser sta passando null quando la data è in formato portoghese-br, come quello :

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) 

Come posso risolvere il problema, per accettare il formato della mia data?

risposta

51

C'è un Gotcha con il legante modello predefinito che non è facile essere informato ma una volta che si sa che si fanno non è più lo stesso errore:

  • Quando si utilizza una richiesta POST, il legante modello predefinito usa le impostazioni della tua cultura per analizzare le date.

  • Quando si utilizza una richiesta GET, il raccoglitore modello predefinito utilizza CultureInfo.InvariantCulture per analizzare le date e ignora le impostazioni cultura correnti.

Dal momento che si sta utilizzando una richiesta GET e passando la data come un parametro di stringa di query, si dovrebbe formattarlo utilizzando il formato cultura invarianti durante l'invio nell'URL. Il modo corretto per formattare la data come parametro della stringa di query è yyyy-MM-dd.

Si può dare un'occhiata al following blog post che entra in maggiori dettagli.

+1

Se si implementa il raccoglitore personalizzato, assicurarsi di registrarlo per DateTime? pure, non solo DateTime. – Justin

+0

Ciao, Darin. Ho riscontrato lo stesso problema del post originale e la tua risposta e l'articolo citato mi hanno aiutato a comprendere il problema, ma non riesco ancora a raggiungere una risposta. Sto lavorando su ASP.NET Core 2.0 ma non so come applicare i consigli dell'articolo. Spero che tu possa dare un'occhiata a questa domanda: https://stackoverflow.com/questions/47442368/routing-datetime-parameter-passing-as-null-empty –

2

Un approccio sarebbe quello di accettare la data come stringa e quindi manipolarla nel controller con la locale/cultura corretta.

8

Come qualcuno che lavora molto con società statunitensi, ho avuto molta esperienza con problemi di data.

Il mio miglior consiglio è quello di scegliere un formato univoco quando si trasmette.

dd-MMM-yyyy 

e

yyyy-MM-dd 

sono scommesse sicure, e sarà analizzato con successo da DateTime.Parse (obj).

Se la modifica del formato della data non è un'opzione, è necessario guardare a DateTime.ParseExact, che consente di specificare la stringa di formato esatta che si sta cercando.

0

Ha avuto lo stesso problema utilizzando uno @Html.Action(..) in una vista.Per questa situazione può essere risolto mettendo il DateTime in un modello:

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

e nella vista:

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

Nota la new { } intorno l'istanza di MyModel, in questo modo il DateTime non è convertito a una stringa. Questa soluzione funziona solo per Html.Action() e non per Html.ActionLink() o Url.Action() poiché MVC sta eseguendo un myModel.ToString() nell'URL.

Problemi correlati