J'essaie de POST à l'action SetLanguage via un lien, mais je ne sais pas comment finaliser le code suivant:
<form id="selectLanguage" asp-controller="Home" asp-action="SetLanguage" asp-route-returnUrl="@Context.Request.Path" method="post" role="form">
@foreach (var culture in cultures) {
<div>
<a href="[email protected]">@culture.Name</a>
</div>
}
</form>
Dois-je utiliser le form
ou il existe une méthode directe pour envoyer un paramètre POST avec le paramètre culture : 'EN'
, Par exemple?
La @Url.Action(action: "SetLanguage", controller:"Home", values: new { culture = culture.Name }, protocol:"POST")
fait-elle le travail?
Mon code de contrôleur est
[HttpPost]
public IActionResult SetLanguage(string culture, string returnUrl)
{
Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }
);
return LocalRedirect(returnUrl);
}
Les liens sont des requêtes GET. Vous ne pouvez pas poster via un lien; c'est à cela que servent les formes. Vous auriez besoin de quelque chose comme:
<form id="selectLanguage" asp-controller="Home" asp-action="SetLanguage" asp-route-returnUrl="@Context.Request.Path" method="post" role="form">
@foreach (var culture in cultures) {
<div>
<button type="submit" name="culture" value="@culture.Name">
@culture.Name
</button>
</div>
}
</form>
Ensuite, quel que soit le bouton sur lequel vous cliquez, sa valeur sera publiée. Si vous souhaitez qu'il ressemble à des liens, vous pouvez styliser les boutons en conséquence.
Alternativement, vous pouvez conserver les liens, mais vous devrez utiliser AJAX pour publier sur clic.
J'utiliserais une action sur les liens eux-mêmes, j'utilise ce morceau de code particulier dans mon projet. Et cela fonctionne comme un charme.
<a asp-controller="YourController"
asp-action="SetLanguage"
asp-route-culture="@culture.Name"
asp-route-returnUri="@Context.Request.Path">
</a>
Mon code de contrôleur ressemble alors à ceci:
public IActionResult SetLanguage(string culture, string returnUri = "")
{
SetSettings(newCultureName);
return Redirect(returnUri);
}
J'espère que cela vous aidera dans votre projet!
Vous pouvez utiliser JQuery:
@foreach (var culture in cultures)
{
<div>
<a href="javascript:setLanguage('@culture.Name')">@culture.Name</a>
</div>
}
<script type="text/javascript">
function setLanguage(culture)
{
$.post("/home/setlanguage", { culture: culture})
.done(function (data) {
location.reload();
});
}
</script>