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

时间:2019-04-11 11:28:19

标签: c# asp.net-mvc asp.net-core-2.1 razor-pages

上下文

我正在使用ASP.NET Core 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的类,该类从Page Model继承,并为数据库,用户和管理者设置了构造函数:

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'相对应的参数””

1 个答案:

答案 0 :(得分:2)

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

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

    // the rest of the class implementation
}

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