основной почтовый метод asp.net, помощники тегов и строка запроса - PullRequest
0 голосов
/ 24 октября 2019

Я получаю это неожиданное поведение от ядра asp.net, которое я начинаю изучать.

У меня есть форма ниже в моем представлении:

<form asp-controller="Account" asp-action="Login" method="post">
    <button type="submit">LOGIN</button>
</form>

Да, я 'Я использую тэг помощники здесь. А вот контроллер:

public class AccountController : Controller
{
    [HttpPost]
    [AllowAnonymous]
    public async Task<IActionResult> Login(string returnUrl)
    {
        if (string.IsNullOrEmpty(returnUrl) || !Url.IsLocalUrl(returnUrl))
                    return RedirectToAction("index", "home");
                else
                    return LocalRedirect(returnUrl);
    }

}

Теперь, насколько я понимаю, returnUrl должен автоматически получить значение строки запроса, если оно есть в строке запроса. Но с такой настройкой этого не происходит. После большого количества царапин на голове я нашел в Интернете решение, которое, на мой взгляд, изменилось на следующее:

<form method="post">
    <button type="submit">LOGIN</button>
</form>

, и тогда оно начинает работать. Но почему существует такое поведение, что вызывает это, почему помощники тегов формы не позволяют привязать строку запроса для этой формы метода сообщения ???

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Если вы используете форму по умолчанию без помощника тега, по умолчанию будет получена строка запроса.

Если вы используете помощник тега для указания контроллера и действия, ваш код будет преобразован в:

<form method="post" action="/Account/Login">

Это привело к тому, что returnUrl всегда будет нулевым.

Для получения returnUrl вам нужно указать маршрут, используя asp-route-{value}, как показано ниже, в противном случае он попадет в шаблон маршрута по умолчанию:

<form asp-controller="Account" asp-action="Login" asp-route-returnUrl="yourUrl" method="post">
<button type="submit">LOGIN</button>
</form>

Это будет означать:

<form method="post" action="/Account/Login?returnUrl=yourUrl">

Ссылка:

https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/built-in/anchor-tag-helper?view=aspnetcore-3.0#asp-route-value

1 голос
/ 24 октября 2019

Вы выполняете запрос POST, поэтому механизм связывания пытается получить параметры из тела запроса.

Вы можете добавить поле в форму:

<form asp-controller="Account" asp-action="Login" method="post">
    <input type="hidden" name="returnUrl" value="http://some_url" />
    <button type="submit">LOGIN</button>
</form>

Илиесли вы хотите выполнить запрос POST и по-прежнему получать параметр returnUrl из строки запроса, вам необходимо указать для этого механизм связывания модели, используя атрибут FromQuery:

[HttpPost]
[AllowAnonymous]
public async Task<IActionResult> Login([FromQuery(Name = "returnUrl")] string returnUrl)
{
    if (string.IsNullOrEmpty(returnUrl) || !Url.IsLocalUrl(returnUrl))
                return RedirectToAction("index", "home");
            else
                return LocalRedirect(returnUrl);
}

Редактировать

В последнем примере вы просто используете стандартный HTML-код без какого-либо помощника ASP.NET, поэтому URL с параметром отправляется на сервер как есть, т.е. без какой-либо обработки средой и, следовательно,анализируется правильно, но это может перестать работать, если вы измените свое имя действия поста, если у вас есть несколько действий поста в вашем контроллере или если у вас определены более сложные маршруты.

...