web-dev-qa-db-ja.com

POST ASP.NET Coreのリンクを使用する方法

POSTを介してSetLanguageアクションにリンクしますが、次のコードを完成させる方法がわかりません。

_<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>
_

formを使用する必要がありますか、またはPOST with _culture : 'EN'_ param、with param)を送信する直接的な方法がありますか?

@Url.Action(action: "SetLanguage", controller:"Home", values: new { culture = culture.Name }, protocol:"POST")は機能しますか?

私のコントローラーコードは

_[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

リンクはGETリクエストです。リンクを介して投稿することはできません。それがフォームの目的です。次のようなものが必要です。

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

次に、どのボタンをクリックしても、その値が投稿されます。リンクのようにしたい場合は、それに応じてボタンのスタイルを設定できます。

または、リンクを維持することもできますが、クリックで投稿するにはAJAXを使用する必要があります。

6
Chris Pratt

リンク自体にアクションを使用します。この特定のコードをプロジェクトで使用します。そしてそれは魅力のように働きます。

<a asp-controller="YourController"
 asp-action="SetLanguage"
 asp-route-culture="@culture.Name"
 asp-route-returnUri="@Context.Request.Path">
</a>

私のコントローラーコードはこのようになります:

  public IActionResult SetLanguage(string culture, string returnUri = "")
        {
            SetSettings(newCultureName);
            return Redirect(returnUri);
        }

これがあなたのプロジェクトに役立つことを願っています!

3
Nicolas Pierre

あなたは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