Я реализовал обходной путь, хотя он выглядит "хакерским", и я ожидал, что на страницах Razor будет какой-то синтаксис c, чтобы сохранить этот ReturnUrl. В любом случае решение состоит в том, чтобы включить в мою модель формы поле, в котором я буду хранить параметр запроса ReturnUrl
при отображении страницы (например: Получить запрос). Например:
public class LoginForm
{
public string ReturnUrl { get; set; } = string.Empty;
}
и код моей страницы бритвы:
public async Task OnGetAsync()
{
var nameValueCollection = HttpUtility.ParseQueryString(Request.QueryString.Value);
const string returnUrlKey = "returnUrl";
var returnUrl = nameValueCollection.Get(returnUrlKey);
LoginForm.ReturnUrl = returnUrl; //here I save the value on the form
// do other things
}
Теперь на моей странице бритвы я добавляю скрытое поле, чтобы передать это значение обратно на сервер при отправке формы. . Например:
<form method="post">
<input asp-for="LoginForm.ReturnUrl" type="hidden" />
<button type="submit" asp-page-handler="Login">Login</button>
</form>
И затем я могу получить доступ к исходному значению в
public async Task<IActionResult> OnPostLoginAsync()
{
if (!ModelState.IsValid)
{
return Page();
}
return Redirect(LoginForm.ReturnUrl);
}
Обратите внимание, что значение ReturnUrl сохраняется, даже если есть ошибка проверки и ModelState
недействителен, чего я и хочу.