Как правильно перенаправить на ту же страницу в ASP.NET Основные страницы Бритвы?

#c# #asp.net-core #razor #razor-pages

Вопрос:

Вот упрощенный код, лежащий в основе:

 
[BindProperty(SupportsGet = true)]
public int ProductId { get; set; }

public Product Product { get; set; }

public void OnGet()
{
    Product = ProductService.Get(ProductId)
}

public IActionResult OnPost()
{
   if (!User.Identity.IsAuthenticated)
   {
       retrun Redirect("/login");
   }
   // Add product to user favorite list
   // Then how to redirect properly to the same page?
   // return Redirect("/product") is not working
   // Calling OnGet() does not work
}

 

А вот соответствующая упрощенная страница Razor:

 @page "/product/{id}"
@model Product

<div>
    @Model.Title
</div>
 

Я застрял на правильном перенаправлении пользователя. Если я не вернусь IActionResult , то мой Redirect("/login") не работает, и я получу исключение нулевой ссылки для @Model.Title .

Если я использую IActionResult тогда свои Redirect("/login") работы, но после входа пользователя в систему и добавления продукта в избранное мой код при возврате пользователя на ту же страницу завершается ошибкой и OneGet не вызывается.

Комментарии:

1. Примечание. для предотвращения атак перенаправления используйте LocalRedirect() при обнаружении, что пользователь не прошел проверку подлинности, и вы перенаправляетесь на страницу входа в систему. LocalRedirect(«/вход») гарантирует, что вы используете локальный путь и защищает вас от изменения параметра URL-адреса возврата строки запроса

Ответ №1:

В Razor вы бы использовали RedirectToPage()

Предположим, что класс называется IndexModel

 public class IndexModel: PageModel
{
    public IActionResult OnPost()
    {
       if (!User.Identity.IsAuthenticated)
       {
           return Redirect("/login");
       }
       // Add product to user favorite list
       // Then how to redirect properly to the same page?
       // return Redirect("/product") is not working
       // Calling OnGet() does not work

       return RedirectToPage("Index");
   }
}
 

примечание: вы написали неправильно return . Это сказано retrun в вашем коде

обновление Вы хотите следовать модели PRG: после P ost вы переходите к G et

чтобы передать параметры обратно в действие OnGet, выполните следующее:

 public void OnGet(int productId)
{
    Product = ProductService.Get(productId)
}
 

и по вашему мнению:

 @page "/product/{productId}"
 

и на посту

 return RedirectToPage("Index", new { productId = ProductId});
 

Комментарии:

1. Спасибо, @Роджер. Но это означает, что я потеряю всю строку запроса и данные маршрута. Как я могу сохранить все URL-адреса? Я имею в виду, что если бы я мог писать RedirectToTheSamePage() , то не беспокоился бы обо всем этом.