web-dev-qa-db-fra.com

Utilisation de RouteDataRequestCultureProvider dans asp net core 3.1

Après avoir mis à niveau le noyau 2.2 vers 3.1, je ne peux pas faire fonctionner RouteDataRequestCultureProvider à fond.

Le routage fonctionne mais les assistants de balise de rasoir ignorent les attributs de culture et de route qui utilisent la culture.

Comme exemple simple d'attribut d'itinéraire personnalisé:

public class StaticPageController : Controller
{
    [Route("{culture:culture}/cookies")]
    public IActionResult Cookies() => View();
}

Si je vais à l'url https://localhost:5002/en/cookies l'action est correctement acheminée. Cependant dans le rasoir, si j'utilise un assistant comme celui-ci:

<a asp-controller="StaticPage" asp-action="Cookies">Cookie information</a>

Le lien résultant qu'il génère est: https://localhost:5002/en/staticpage/cookies

Dans le noyau 2.2, cela générait correctement l'url https://localhost:5002/en/cookies

Le dictionnaire de données d'itinéraire contient correctement une entrée pour la culture mais l'aide au rasoir ne l'utilise plus et utilise par défaut le modèle d'itinéraire par défaut:

app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
            endpoints.MapControllerRoute("default", "{culture:culture}/{controller=Home}/{action=Index}/{id?}");
        });

Quelqu'un sait-il pourquoi l'assistant de balise de rasoir n'utilise plus la culture du dictionnaire de données d'itinéraire?

MODIFIER:

Je sais maintenant que la culture n'est pas transmise des valeurs de route au générateur d'URL car elle est considérée comme ambiante et les valeurs ambiantes ne sont plus incluses à partir du noyau 2.2.

Les valeurs Route Data pour la demande actuelle sont considérées comme des valeurs ambiantes dans ASP.NET Core 2.1 et versions antérieures

Je peux résoudre ce problème en spécifiant explicitement la culture ainsi:

 <a 
    asp-controller="StaticPage" 
    asp-action="Cookies" asp-route- 
    culture="@Context.Request.RouteValues["culture"]">
       Cookies
 </a>

Spécifier cela pour chaque lien sur chaque page va être très fastidieux.

Existe-t-il un moyen de remplacer le tag helper pour inclure automatiquement la culture actuelle dans les valeurs de l'itinéraire?

6
herostwist

@herostwist, votre solution m'a sauvé la journée :)

juste une version simplifiée de celui-ci:

//...
public CultureAnchorTagHelper(IHtmlGenerator generator) : base(generator)
{
    RouteValues["culture"] = CultureInfo.CurrentCulture.Name;
}
0
Laz Ziya