#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()
, то не беспокоился бы обо всем этом.