Asp.net core 如何用RazorPages路由替换MVC HomeController/Index重定向?
我正在从ASP MVC Classic迁移到ASP Razor页面 只剩下一个要“迁移”的控制器:HomeControllerAsp.net core 如何用RazorPages路由替换MVC HomeController/Index重定向?,asp.net-core,asp.net-core-mvc,asp.net-core-2.1,razor-pages,Asp.net Core,Asp.net Core Mvc,Asp.net Core 2.1,Razor Pages,我正在从ASP MVC Classic迁移到ASP Razor页面 只剩下一个要“迁移”的控制器:HomeController public class HomeController : Controller { UserManager<WebUser> _userManager; public HomeController(UserManager<WebUser> _userManager) {
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" });
}
}
公共类HomeController:控制器
{
用户管理器(UserManager);;
公共家庭控制器(UserManager\u UserManager)
{
这是.\u userManager=\u userManager;
}
[授权]
公共异步任务索引()
{
var user=await\u userManager.GetUserAsync(用户);
if(user==null)
{
返回RedirectToPage(“/Account/Login”,new{area=“WebUserIdentity”});
}
返回RedirectToPage(“/Index”,new{area=“Downloads”});
}
}
此控制器/操作没有对应的视图
正因为如此,我陷入了困境:如何配置razor页面的路由以使用这些重定向(到两个不同的区域),而不创建“假”索引页面 我相信您可以转换控制器,为索引页面
页面/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" });
}
}
公共类索引模型:PageModel{
用户管理器(UserManager);;
公共索引模型(UserManager\u UserManager){
这是.\u userManager=\u userManager;
}
公共异步任务OnGetAsync(){
var user=await\u userManager.GetUserAsync(用户);
if(user==null){
返回RedirectToPage(“/Account/Login”,new{area=“WebUserIdentity”});
}
返回RedirectToPage(“/Index”,new{area=“Downloads”});
}
}
要重定向到不同的页面,我建议您尝试中间件
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();
那么,为什么不让控制器保持原样,让它像当前一样重定向呢?我相信您仍然可以为索引页面页面/IndexModel
创建页面模型,并执行相同的重定向。只是为了净化。我会很高兴当可以删除控制器和视图文件夹。ASP MVC是邪恶的(当有剃刀页面时)你是对的。我将以这个结束。但我希望,只有使用纯“路由”配置才能迁移。奇怪的是,为诸如重定向默认“/”到区域这样的常见任务创建整个页面:)。(实际上,检查是否未通过身份验证转到其他区域是可选的)您当前的代码有什么问题?在页面
下是否有索引模型
?如果您从web浏览器访问WebUserIdentity/Account/Login
和Downloads/Index
,它能访问吗?谢谢,Tao。如果您知道所有细节,这应该是正确的方法,但对我来说,很难评估对性能的影响(此代码将在每个请求中执行)和异常情况:我是否应该try。。catch
(异常:没有机会实现Error.cshtml)?