Страница возврата бритвы ASP.NET Core 2.1 с моделью - PullRequest
0 голосов
/ 08 октября 2018

Я использую ASP.NET Core 2.1 для создания сервера идентификации.Я использую Asp Identity и создаю страницы входа и регистрации.

У меня есть следующая страница:

[AllowAnonymous]
public class RegisterModel : PageModel
{
 ......
 public string ReturnUrl { get; set; }
 ......
 public void OnGet(string returnUrl = null)
 {
     ReturnUrl = returnUrl;
 }
 public async Task<IActionResult> OnPostAsync(string returnUrl = null)
 {
     returnUrl = returnUrl ?? Url.Content("~/");
     if (ModelState.IsValid)
     {
         return LocalRedirect(returnUrl);
     }

     return Page();
}

Cshtml содержит:

@page
@model RegisterModel
......
<form asp-route-returnUrl="@Model.ReturnUrl" method="post">
......

Поведение: Я попадаю на страницу по этой ссылке: https://localhost:5028/Identity/Account/Register?returnUrl=testlink, поэтому ReturnUrl получает значение "testlink" в OnGet () и передается в форму.

  1. Правильно: если я создаю пользователя без ошибок проверки (ModelState действителен), то LocalRedirect (returnurl) вызывается с помощью "testlink".
  2. Неправильно: если я создаю пользователя с ошибками проверки (ModelStateневерно), затем вызывается функция Page ().Проблема в том, что в этом случае страница генерируется с пустой моделью (@ Model.ReturnUrl имеет значение null).Пользователь видит ошибки проверки в форме, исправляет их, но когда он отправляет форму, он не будет перенаправлен на «testlink», потому что она была потеряна.

Мой вопрос: Чем заменить " return Page (); ", чтобы я мог исправить поведение, описанное в случае 2?Я попытался " return LocalRedirect (" / Identity / Account / Register? ReturnUrl = "+ returnUrl) ", но это обновляет страницу (очищает ввод пользователя и не отображает сообщения об ошибках проверки).

Спасибо!

1 Ответ

0 голосов
/ 08 октября 2018

Установите свойство ReturnUrl на POST, чтобы оно было доступно при перезагрузке страницы.

public IActionResult OnPost(string returnUrl = null) {
    returnUrl = returnUrl ?? Url.Content("~/");
    if (ModelState.IsValid) {
        return LocalRedirect(returnUrl);
    }
    //...if we get this far something went wrong.
    //reset properties on model so they appear when page reloads
    ReturnUrl = returnUrl;
    return Page();
}
...