我是否必须在每个剃须刀页面模型中调用数据库?

Do I have to call the database in every single razor page model?

上下文

我正在使用 ASP.NET 核心 2.1 和剃刀页面。到目前为止我没有使用 MVC,但如果需要我愿意添加它。

我有结构"Pages/MyPages/Login.cshtml"。
“.../Login.cshtml”页面有一个名为“.../Login.cshtml.cs”的模型

现在,我在“.../Login.cshtml.cs”中有这段代码:

public class LoginModel : PageModel
    {
        // Set up private variables for database access and user/login managers
        private readonly AppDbContext _db;
        private readonly UserManager<AppUser> _userManager;
        private readonly SignInManager<AppUser> _signInManager;

        // Import database access and user/login managers
        public LoginModel(
            AppDbContext db,
            UserManager<AppUser> userManager,
            SignInManager<AppUser> signInManager)
        {
            _db = db;
            _userManager = userManager;
            _signInManager = signInManager;
        }
        ...
    }

问题

我有另一个名为 "Pages/MyPages/CreateUser.cshtml" 的剃须刀页面,它有自己的模型称为“.../CreateUser.cshtml.cs”,即:

public class CreateUserModel : PageModel
    {
        // Set up private variables for database access and user/login managers
        private readonly AppDbContext _db;
        private readonly UserManager<AppUser> _userManager;
        private readonly SignInManager<AppUser> _signInManager;

        // Import database access and user/login managers
        public CreateUserModel(
            AppDbContext db,
            UserManager<AppUser> userManager,
            SignInManager<AppUser> signInManager)
        {
            _db = db;
            _userManager = userManager;
            _signInManager = signInManager;
        }
        ...
    }

和Login.cshtml.cs中的代码一模一样,我想知道有没有办法把这段代码一次写完,应用到我需要的每一个模型上。

没用

我尝试创建一个名为 MyPageModel.cs 的 class,它继承自页面模型并设置了一个包含数据库、用户和管理器内容的构造函数:

public class MyPageModel : PageModel
    {
        protected AppDbContext _db;
        protected UserManager<AppUser> _userManager;
        protected SignInManager<AppUser> _signInManager;

        public MyPageModel(
           AppDbContext db,
           UserManager<AppUser> userManager,
           SignInManager<AppUser> signInManager)
        {
            _db = db;
            _userManager = userManager;
            _signInManager = signInManager;
        }
    }

然后Login.cshtml.cs和CreateUser.cs从中继承:

public class LoginModel : MyPageModel
    {
    ...
    }

但它给出了这个错误:

" 没有给定的参数对应于 'MyPageModel.MyPageModel(AppDbContext, UserManager, SigInManager)' 的所需格式参数 'db' "

您的基本页面模型有一个带参数的构造函数,但继承 classes 没有使用该构造函数。他们需要为该构造函数提供值:

public class LoginModel : MyPageModel
{
    public LoginModel(AppDbContext db, UserManager<AppUser> userManager, SignInManager<AppUser> signInManager)
        : base(db, userManager, signInManager) { }

    // the rest of the class implementation
}

他们不需要自己的构造函数实现,但至少需要接收所需的构造函数参数并将它们传递给基础 class 构造函数。