web-dev-qa-db-fra.com

Comment définir la culture pour la liaison de date dans Asp.Net Core?

J'ai une application Asp.Net Core avec MVC. Je soumets un formulaire avec une date sur le formulaire.

Le formulaire ressemble (grosso modo) à ceci:

@model EditCustomerViewModel
<form asp-action="Edit">
    <input asp-for="ServiceStartDate" class="form-control" type="date" />
    <input type="submit" value="Update" class="btn btn-success" />
</form>

L'action du contrôleur est:

[HttpPost]
public async Task<IActionResult> Edit(EditCustomerViewModel viewModel)
{
    // do stuff
    return RedirectToAction("Index");
}

Le modèle de vue est:

public class EditCustomerViewModel
{
    public Guid Id { get; set; }

    [DataType(DataType.Date)]
    public DateTime ServiceStartDate { get; set; }

    [DataType(DataType.Date)]
    public DateTime? ServiceEndDate { get; set; }

    // etc.
}

Je suis au Royaume-Uni, donc les dates ne sont pas au format américain: dd/MM/YYYY. Donc, par défaut, je soumets 6/22/2017.

Lorsque vous regardez le modèle de vue soumis dans le contrôleur pendant le débogage, les dates sont nulles si elles sont soumises au format britannique, mais elles conviennent si vous utilisez le format américain. c'est à dire. 6/22/2017 me donne null, mais 22/6/2017 est lié à la date correcte.

J'ai essayé d'ajouter ceci à Startup.cs mais cela n'a fait aucune différence:

var supportedCultures = new[] { new CultureInfo("en-GB") };
app.UseRequestLocalization(new RequestLocalizationOptions
{
    DefaultRequestCulture = new RequestCulture("en-GB"),
    SupportedCultures = supportedCultures,
    SupportedUICultures = supportedCultures
});
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-GB");
CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("en-GB");
CultureInfo.CurrentCulture = new CultureInfo("en-GB");
CultureInfo.CurrentUICulture = new CultureInfo("en-GB");

J'ai vérifié les en-têtes HTTP et je publie un en-tête correct:

Accept-Language: en-GB,en

Qu'est-ce que je fais mal? Comment puis-je dire aux classeurs MVC Core de lier les dates au format britannique?

p.s. Je suis sur VS2017 avec le fichier de projet * .csproj, avec le framework cible .NetCoreApp 1.1

11
trailmax

Un certain nombre de choses. Je ne suis pas sûr que vous puissiez pousser un nouvel objet de paramètres dans le middleware comme ça (vous pouvez probablement), mais la plupart du temps je l'ai vu utilisé dans la méthode ConfigureServices comme ceci:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<RequestLocalizationOptions>(options =>
    {
        options.DefaultRequestCulture = new Microsoft.AspNetCore.Localization.RequestCulture("en-NZ");
        options.SupportedCultures = new List<CultureInfo> { new CultureInfo("en-US"), new CultureInfo("en-NZ") };
    });

    services.AddMvc();
}

Seconde. L'ordre de votre middleware est très important. Assurez-vous que votre appel à UseRequestLocalization se produit avant UseMvc. En fait, cela devrait probablement être la première chose dans votre pipeline, sauf s'il y a une raison spécifique pour laquelle cela ne peut pas être.

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    app.UseRequestLocalization();
    app.UseMvc();
}

Et enfin, pouvez-vous essayer de supprimer tous les fournisseurs du pipeline (dont l'un est un fournisseur de cookies. Je ne comprends pas pourquoi vous auriez ce cookie, mais essayons simplement).

Dans votre méthode de configuration, appelez clear sur la liste RequestCultureProviders. Cela devrait garantir qu'il n'y a rien d'autre pour établir une culture.

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<RequestLocalizationOptions>(options =>
    {
        options.DefaultRequestCulture = new Microsoft.AspNetCore.Localization.RequestCulture("en-GB");
        options.SupportedCultures = new List<CultureInfo> { new CultureInfo("en-GB") };
        options.RequestCultureProviders.Clear();
    });

    services.AddMvc();
}

Plus d'informations: http://dotnetcoretutorials.com/2017/06/22/request-culture-asp-net-core/

18
MindingData

Réponse mise à jour pour aspnet core 2.0

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        var supportedCultures = new[] { new CultureInfo("es-CO") };
        app.UseRequestLocalization(new RequestLocalizationOptions
        {
            DefaultRequestCulture = new RequestCulture("es-CO"),
            SupportedCultures = supportedCultures,
            SupportedUICultures = supportedCultures
        });

        // other configurations after (not before)
    }
11
Johann Medina