Changement de format par défaut pour le type DateTime l'analyse en ASP.NET de Base
- Je obtenir une Date dans un ASP.NET Contrôleur de Base comme ceci:
public class MyController:Controller{
public IActionResult Test(DateTime date) {
}
}
Le cadre est en mesure d'analyser les date, mais uniquement en anglais pour le format. Quand je passe la 04.12.2017 comme paramètre de date, je veux dire le 4 décembre 2017. Cela se analysée comme en anglais date, donc mon objet date obtient la valeur 12 avril 2017. J'ai essayé d'ajouter en allemand uniquement à l'aide de cette article et également cette, mais sans succès.
Ce qui doit être fait ASP.NET Core analyser automatiquement les dates dans le bon allemand format?
Mise à jour
J'ai Essayé de définir le 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;
});
Ne fonctionne toujours pas. J'appelle example.com/Test?date=12.04.2017 et a obtenu ce dans mon débogueur:
public IActionResult Test(DateTime date) {
string dateString = date.ToString("d"); //04.12.2016
string currentDateString = DateTime.Now.ToString("d"); //14.01.2016
return Ok();
}
Comme je l'ai dit: Un appel avec le Test?date=12.04.2017 paramètre résultats dans 04.12.2017 que de la date de l'objet à l'intérieur de la fonction de Test. - Je m'attendre non modifié à ce jour, de sorte 12.04.2017 au lieu de 04.12.2017.
Passer comme une chaîne de caractères, puis utilisez
DateTime.ParseExact
il parse exactement de la manière que vous voulez.Pour un point de clarté (pour favoriser la discussion) 04.12.2017 être 4 décembre est format anglais, ou plus précisément de l'anglais britannique. Qu'il soit le 12 avril est l'anglais AMÉRICAIN en format. Bien que le royaume-UNI serait d'utiliser un / au lieu d'un . comme un séparateur.
salut @Lion, j'ai collé de Démarrage.cs pour asp.net de base, le type de projet et de définir la culture de l'info . quand j'ai regardé à la culture actuelle dans mon contrôleur a été mis à de . Veuillez essayer ceci si cela aide . J'ai essayé il m'a montré dates DE format . Je n'ai pas essayé avec le paramètre dans le contrôleur de bits om Immédiate de la fenêtre .
OriginalL'auteur Lion | 2017-01-13
Vous devez vous connecter pour publier un commentaire.
Eu le même problème. En passant DateTime dans le corps de la requête fonctionne très bien (parce que Json convertisseur gère le personnel), en passant DateTime dans la chaîne de requête comme un paramètre a une certaine culture de questions.
Je n'aime pas le "changement de toutes les demandes de la culture", car cela pourrait avoir un impact sur un autre type d'analyse, qui n'est pas souhaitable.
Donc mon choix a été de remplacer la valeur par défaut DateTime modèle de liaison à l'aide de IModelBinder: https://docs.microsoft.com/en-us/aspnet/core/mvc/advanced/custom-model-binding
Ce que j'ai fait:
1) Définir un liant (c# 7 syntaxe pour 'sortir' le paramètre est utilisé):
2) Définir le fournisseur de votre classeur:
3) Et enfin, enregistrez votre fournisseur pour être utilisé par ASP.NET Core:
Maintenant votre DateTime sera analysée comme prévu.
la Documentation de Microsoft suggèrent de ne pas utiliser des classeurs de modèle pour la conversion de chaînes à d'autres types comme les meilleures pratiques: ne doit Généralement pas être utilisé pour convertir une chaîne en un type personnalisé, un TypeConverter est généralement une meilleure option.. Pensez à utiliser
TypeConverter
Merci, a fonctionné pour moi aussi. Juste une remarque: le modèle de classeur ci-dessus n'est pas de la manipulation bien DateTime? les valeurs null.
OriginalL'auteur Igor Fedchenko
Je voulais formater les dates dans mes réponses et je n'ai la suite dans ConfigureServices méthode:
Espère que ça aide.
var deserialized = JsonConvert.DeserializeObject(myJsonstring, new JsonSerializerSettings { DateFormatString = "dd/MM/yyyy" });
c'était vraiment utile, merci!
OriginalL'auteur PayamGerami
MVC a toujours utilisé
InvariantCulture
pour les données d'itinéraire et des chaînes de requête (paramètres qui vont dans l'URL). La raison derrière cela est que les Url en application localisée doit être universelle. Sinon, une url peut fournir des données différentes selon les paramètres régionaux de l'utilisateur.Vous pouvez remplacer la requête et de la route ValueProviderFactories avec votre propre que le respect de la culture actuelle (ou utilisez
method="POST"
dans les formulaires)P. S. C'est un comportement raisonnable, mais je ne comprends pas pourquoi la documentation ne couvre pas cette chose très importante.
OriginalL'auteur Sergei Shvets
DateTime.Now
mais pas l'argument qui a été analysée à partir du paramètre GET. Veuillez voir mon montage dans la question de la cause de son trop long pour un commentaire.ohhh . permettez-moi de vérifier auprès de votre édité réponse . juste pour confirmer ce que devrait être le résultat correct dans ce cas ?
12.04.2017 en entrée doit être analysée comme 12 avril 2014 à la place du 4 décembre 2014 comme ASP.NET n'.
OriginalL'auteur Yashveer Singh
Si vous n'avez pas l'esprit en utilisant le générique StatusCode méthode pour faire cet appel, vous pouvez faire quelque chose comme ce qui suit:
Vous pouvez ajouter à une classe de base et de l'appeler comme:
C'est à vous, si vous voulez créer votre propre Ok, BadRequest, etc...méthodes, mais pour moi cela fonctionne, et j'espère que cela aide quelqu'un d'autre. Vous pourriez même par défaut int code = 200, si la plupart de vos demandes Obtient. Ce code suppose que vous voulez répondre avec une chaîne de caractères, booléen ou un objet personnalisé, mais vous pouvez facilement gérer toutes les primitives par la vérification de Type.GetTypeInfo().IsPrimitive et même de faire quelques vérifications pour les décimales, chaîne, DateTime, TimeSpan, DateTimeOffset, ou le Guid.
OriginalL'auteur pqsk
J'ai eu le même problème ad presque est devenu fou. J'ai essayé tout sans sucsses. J'ai d'abord trouvé une solution de contournement pour résoudre une partie de mon problème:
Solution de contournement:
Mais, de cette façon, je aways ont pour définir invariantculture à tous mes datetime. J'ai trouvé la solution réglage de ma culture à le configurer au démarrage.cs.
Ensemble de la Culture au démarrage.cs
Espère que cela vous aidera.
OriginalL'auteur Rogerio Azevedo
Envisager d'utiliser un custom
TypeConverter
pour votre datetime (Source):et l'utilisation
TypeConverter
attribut sur votre propriété:Mise à jour
Basé sur mon expérience et grâce à cette réponse et @zdeněk commentaire, TypeConverter attribut ne fonctionne pas et que vous devriez vous inscrire TypeConverter dans
Startup.cs
:OriginalL'auteur Shahab
Essayer le réglage de la culture manuellement dans votre
web.config
EDIT: Depuis que j'ai juste réalisé que c'est de Base, vous pouvez le faire de cette façon en Démarrage.Configurer:
J'ai déjà essayé de réglage
CultureInfo.DefaultThreadCurrentCulture
etCultureInfo.DefaultThreadCurrentUICulture
et au début de l'action de Test, ils sont correctement mis à la de-de. Mais ASP.NET de base n'a pas de soins, le paramètre GET est analysée mal.OriginalL'auteur maksymiuk
Comme par https://stackoverflow.com/a/3477821/2914174
avez-vous essayé ma réponse ?
OriginalL'auteur Ryan