Вопрос: Как выполнить POST через ссылку в ядре ASP.NET


Я пытаюсь выполнить 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="?culture=@culture.Name">@culture.Name</a>
        </div>
    }
 </form>

Должен ли я использовать form или существует прямой способ отправки POST с culture : 'EN' 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);
}

3


источник


Ответы:


Ссылки - это запросы 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 для публикации по клику.


4



Я бы использовал действие по ссылкам, я использую этот фрагмент кода в своем проекте. И это работает как шарм.

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

Надеюсь, это поможет вам в вашем проекте!


1



Вы можете использовать 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