ASP.NET Core身份中的基础控制器继承

时间:2019-05-05 15:22:18

标签: c# asp.net-core .net-core

我刚刚在ASP.NET Core中开始了我的第一个项目,并且我从.Net框架进行了迁移。

我使用ASP.NET Core 2.1创建了一个新项目,并通过

添加了Identity
Right click on project -> Add -> Add scaffolded items

到我的项目。

首先让我感到困惑。所有用于标识的文件都移动到一个名为“身份和管理”部分的区域,该文件已移动到“帐户”文件夹。最重要的是我没有帐户和管理控制器

我创建了一个名为BaseController的新空控制器:

public class BaseController : Controller
{
    private ApplicationDbContext _db { get; set; }

    public BaseController(ApplicationDbContext db)
    {
        _db = db;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (HttpContext.User.Identity.IsAuthenticated)
        {
            string userEmail = User.Identity.Name;                
            ViewBag.CurrentUser = _db.Users.Where(u => u.Email.Equals(userEmail)).FirstOrDefault();
        }

        base.OnActionExecuting(filterContext);
    }
}

在此控制器中,我获得了登录用户,并将其传递给ViewBag,并在我的视图中显示它。

我有一个HomeController继承自BaseController

public class HomeController : BaseController
{
    private UserManager<ApplicationUser> _userManager { get; set; }
    private readonly ApplicationDbContext _db;

    public HomeController(UserManager<ApplicationUser> userManager, 
                          ApplicationDbContext db) : base (db)
    {
        _userManager = userManager;
        _db = db;
    }

    public IActionResult Index()
    {
        return View();
    }

    [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
    public IActionResult Error()
    {
        return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
    }
}

这部分代码可以正常工作,但是当我尝试导航到Manage/IndexManage/ChangePassword时,出现此错误,并且我不知道如何解决此问题。导致此错误的原因是ViewBag为空,因为基本控制器操作从不运行。

对不起,如果我的问题很简单而且不专业

1 个答案:

答案 0 :(得分:0)

在asp.net core 2.1中,脚手架标识使用Razor Pages而不是MVC结构,因此Identity区域中没有控制器,您不能继承控制器。请参阅here

由于它位于区域内,因此您需要使用https://localhost:44367/Identity/Account/Manage/Indexhttps://localhost:44367/Identity/Account/Manage/ChangePassword之类的URL来访问Razor页面。

此外,Razor Pages不支持ViewBag,您可以改用ViewData,请参考here

要为“剃刀页面”添加过滤器,可以参考Filters in Razor Pages

public class BasePageModel : PageModel
{
    public override void OnPageHandlerExecuting(PageHandlerExecutingContext context)
    {
        //...
    }
}
public class IndexModel : BasePageModel
{
    public void OnGet()
    {
        //...
    }
}