web-dev-qa-db-fra.com

Comment POST via un lien dans ASP.NET Core

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);
}
9
Serge

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.

6
Chris Pratt

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!

3
Nicolas Pierre

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>
1
EricImhauser