Как заменить перенаправления MVC HomeController / Index маршрутизацией RazorPages?

Я перехожу с ASP MVC Classic на ASP Razor Pages.

Остался только один контроллер, который нужно «перенести»: HomeController.

 public class HomeController : Controller
 {
        UserManager<WebUser> _userManager;

        public HomeController(UserManager<WebUser> _userManager)
        {
            this._userManager = _userManager;
        }

        [Authorize]
        public async Task<IActionResult> Index()
        {
            var user = await _userManager.GetUserAsync(User);
            if (user == null)
            {
                return RedirectToPage("/Account/Login", new { area = "WebUserIdentity" });
            }
            return RedirectToPage("/Index", new { area = "Downloads" });
        }
 }

Для этого контроллера / действия нет соответствующего представления.

И из-за этого я застрял: как настроить маршрутизацию для бритвенных страниц, чтобы использовать эти перенаправления (в две разные области), не создавая «фальшивую» страницу индекса?


person Roman Pokrovskij    schedule 08.10.2018    source источник
comment
Так почему бы не оставить контроллер как есть и перенаправить его, как сейчас?   -  person Nkosi    schedule 09.10.2018
comment
Я считаю, что вы все еще можете создать модель страницы для индексной страницы Pages/IndexModel и выполнять те же перенаправления.   -  person Nkosi    schedule 09.10.2018
comment
просто для очищения. Буду рад, когда удастся удалить папку Controller и VIews. ASP MVC - это зло (когда есть Razor Pages)   -  person Roman Pokrovskij    schedule 09.10.2018
comment
Ты прав. Я истечу этим. Но я надеюсь, что миграцию можно будет выполнить только с использованием чистой конфигурации маршрутизации. Странно создавать ВЕСЬ СТРАНИЦУ :) для такой типичной задачи, как редирект по умолчанию / в область. (на самом деле проверка, если он не аутентифицирован, переход в другую область не является обязательным)   -  person Roman Pokrovskij    schedule 09.10.2018
comment
В чем проблема с вашим текущим кодом? У вас IndexModel под Pages? Если вы входите в WebUserIdentity/Account/Login и Downloads/Index из веб-браузера, сможет ли он получить доступ?   -  person Edward    schedule 09.10.2018
comment
Нет, у меня нет IndexModel в разделе Pages, и я не хочу создавать поддельную indexmodel, как это было сделано для MVC.   -  person Roman Pokrovskij    schedule 09.10.2018


Ответы (2)


Я считаю, что вы можете преобразовать контроллер для создания модели страницы для индексной страницы Pages/IndexModel и выполнить те же перенаправления.

public class IndexModel : PageModel {
    UserManager<WebUser> _userManager;

    public IndexModel(UserManager<WebUser> _userManager) {
        this._userManager = _userManager;
    }

    public async Task<IActionResult> OnGetAsync() {
        var user = await _userManager.GetUserAsync(User);
        if (user == null) {
            return RedirectToPage("/Account/Login", new { area = "WebUserIdentity" });
        }
        return RedirectToPage("/Index", new { area = "Downloads" });
    }
}
person Nkosi    schedule 08.10.2018

Для перенаправления на разные страницы предлагаю попробовать middleware.

app.Use(async (context, next) =>
        {
            // Do work that doesn't write to the Response.
            if (!context.User.Identity.IsAuthenticated && context.Request.Path != "/WebUserIdentity/Account/Login")
            {
                context.Response.Redirect("/WebUserIdentity/Account/Login");
            }
            else if (context.Request.Path == "/")
            {
                context.Response.Redirect("/Downloads/Index");
            }
            await next.Invoke();
            // Do logging or other work that doesn't write to the Response.
        });

        app.UseMvc();
person Edward    schedule 09.10.2018
comment
Спасибо, Тао. Это должно быть правильным способом, если вы знаете все детали, но для меня трудно оценить влияние на производительность (этот код будет выполняться каждый запрос) и ситуацию исключения: должен ли я try.. catch (исключение нет возможности достичь ошибки .cshtml)? - person Roman Pokrovskij; 01.11.2018