Modificare l’impostazione di formato DateTime analisi ASP.NET Core
Ho una Data in un ASP.NET Core Controller come questo:
public class MyController:Controller{
public IActionResult Test(DateTime date) {
}
}
Il quadro è in grado di analizzare la data, ma solo in formato inglese. Quando passo 04.12.2017 come parametro di data, voglio dire, il 4 dicembre 2017. Questo potrebbe ottenere analizzato come l’inglese, quindi la mia data oggetto si ottiene il valore 12 aprile 2017. Ho cercato di aggiungere solo in tedesco utilizzando questo articolo e anche questo, ma senza successo.
Ciò che deve essere fatto ASP.NET Core analizzare automaticamente le date è corretta tedesco formato?
Aggiornamento
Ho Provato a impostare la RequestLocalizationOptions
services.Configure<RequestLocalizationOptions>(opts =>
{
var supportedCultures = new[]
{
new CultureInfo("de-DE"),
};
opts.DefaultRequestCulture = new RequestCulture("de-DE");
//Formatting numbers, dates, etc.
opts.SupportedCultures = supportedCultures;
//UI strings that we have localized.
opts.SupportedUICultures = supportedCultures;
});
Ancora non funziona. Io chiamo example.com/Test?date=12.04.2017 e ottenuto questo nella mia debugger:
public IActionResult Test(DateTime date) {
string dateString = date.ToString("d"); //04.12.2016
string currentDateString = DateTime.Now.ToString("d"); //14.01.2016
return Ok();
}
Come ho detto: Una chiamata con il Test?data=12.04.2017 parametro risultati in 04.12.2017 come la data e l’oggetto all’interno della funzione di Test. Mi aspetto originale data, in modo 12.04.2017 invece di 04.12.2017.
Passare come una stringa, quindi utilizzare
DateTime.ParseExact
di analizzarlo esattamente in che modo si desidera.Per un punto di chiarezza (per aiutare la discussione) 04.12.2017 essere 4 dicembre inglese formato, o più precisamente l’inglese britannico. Essendo 12 aprile è inglese formato. Anche se il regno UNITO sarebbe utilizzare un / invece di una . come separatore.
ciao @Lion ho incollato Avvio.cs per asp.net core tipo di progetto e impostare la cultura info . quando ho guardato cultura nel mio controller è stato impostato per DE . Si prega di provare questo, se questo aiuta . L’ho provato, mi ha mostrato le date nel formato DE . Non ho provato con il parametro controller po ‘ om finestra Immediata .
OriginaleL’autore Lion | 2017-01-13
Avuto lo stesso problema. Passando DateTime nella richiesta del corpo funziona bene (perché Json converter gestisce questo personale), passando DateTime nella stringa di query come parametro ha un po ‘ di cultura questioni.
Non mi piace il “cambiare tutte le richieste di cultura” approccio, perché questo potrebbe avere un impatto su un altro tipo di analisi, che non è desiderabile.
Quindi la mia scelta è stata per ignorare l’impostazione predefinita DateTime modello di associazione utilizzando IModelBinder: https://docs.microsoft.com/en-us/aspnet/core/mvc/advanced/custom-model-binding
Quello che ho fatto:
1) Definire personalizzato legante (c# 7 la sintassi per il ‘fuori’ il parametro è utilizzato):
2) Definire il fornitore per il vostro raccoglitore:
3) E, infine, registra il tuo provider per essere utilizzato da ASP.NET Core:
Ora il tuo DateTime verrà analizzato come previsto.
la Documentazione Microsoft suggerisce di non utilizzo di leganti modello Personalizzato per la conversione di stringhe di altri tipi, come best practice: in Genere non dovrebbe essere utilizzato per convertire una stringa in un tipo personalizzato, un TypeConverter è di solito una scelta migliore.. Considerare l’utilizzo di
TypeConverter
Grazie, ha funzionato anche per me. Solo una nota: il modello del raccoglitore di cui sopra non gestisce bene DateTime? i valori null.
OriginaleL’autore Igor Fedchenko
Volevo formattare le date nelle mie risposte e ho fatto la seguente in ConfigureServices metodo:
Speranza che aiuta.
var deserialized = JsonConvert.DeserializeObject(myJsonstring, new JsonSerializerSettings { DateFormatString = "dd/MM/yyyy" });
OriginaleL’autore PayamGerami
MVC ha sempre usato
InvariantCulture
per instradare i dati e le stringhe di query (parametri che vanno nell’URL). Il motivo è che gli Url in applicazione localizzata deve essere universale. In caso contrario, un url in grado di fornire dati diversi a seconda della localizzazione dell’utente.È possibile sostituire la query e percorso ValueProviderFactories con la tua che rispetto la cultura corrente (o utilizzare
method="POST"
in moduli)P. S. è un comportamento ragionevole, ma non capisco perché la documentazione non coprire questa cosa molto importante.
OriginaleL’autore justserega
DateTime.Now
ma non è l’argomento che ha analizzato il parametro. Si prega di vedere la mia modifica in questione causa della sua troppo lungo per un commento.ohhh . fammi controllare con la vostra modifica di risposta . solo per confermare quello che dovrebbe essere il risultato corretto in questo caso ?
12.04.2017 come input deve essere analizzato come 12 aprile 2014, invece, 4 dicembre 2014 come ASP.NET fa.
OriginaleL’autore Yashveer Singh
Se non ti dispiace utilizzando il generico StatusCode metodo per effettuare questa chiamata, si può fare qualcosa di simile:
Si può aggiungere a una classe di base e di chiamare le cose come:
Spetta a voi se si desidera creare il proprio Ok, BadRequest, ecc…metodi, ma per me questo funziona e spero che aiuta chiunque altro. Si potrebbe anche di default int codice = 200, se la maggior parte delle richieste Arriva. Questo codice si presuppone che si desidera rispondere con una stringa, booleano, o un oggetto personalizzato, ma si può facilmente gestire tutte le primitive controllando Tipo.GetTypeInfo().IsPrimitive e anche di fare alcuni controlli per il decimale, stringa, data e ora, Durata, DateTimeOffset o Guid.
OriginaleL’autore pqsk
Ho avuto lo stesso problema ad quasi impazzita. Ho provato di tutto senza sucsses. Prima ho trovato una soluzione alternativa per risolvere il mio problema:
Soluzione:
Ma, in questo modo ho sempre necessario impostare invariantculture a tutti i miei datetime. Ho trovato la soluzione impostazione della mia cultura presso la configurazione di avvio.cs.
Set di Cultura all’avvio.cs
Spero che questo vi aiuterà.
OriginaleL’autore Rogerio Azevedo
Considerare l’utilizzo di un custom
TypeConverter
per il tuo datetime (Fonte):e utilizzare
TypeConverter
attributo proprietà:Aggiornamento
Sulla base della mia esperienza e grazie a questa risposta e @zdeněk commento, TypeConverter attributo non funzionano e si dovrebbe registrare TypeConverter in
Startup.cs
:OriginaleL’autore KiNG
Provare a impostare la cultura manualmente nel vostro
web.config
EDIT: Dal momento che ho capito che questo è il Nucleo, è possibile farlo in questo modo all’Avvio.Configurare:
Ho già provato impostazione
CultureInfo.DefaultThreadCurrentCulture
eCultureInfo.DefaultThreadCurrentUICulture
e all’inizio del Test d’azione, sono correttamente impostato su DE. Ma ASP.NET core non cura, il parametro viene analizzato sbagliato.OriginaleL’autore maksymiuk
Come per https://stackoverflow.com/a/3477821/2914174
hai provato la mia risposta ?
OriginaleL’autore Ryan