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

Posted

技术标签:

【中文标题】我是不是必须在每个剃须刀页面模型中调用数据库?【英文标题】:Do I have to call the database in every single razor page model?我是否必须在每个剃须刀页面模型中调用数据库? 【发布时间】:2019-09-02 00:39:32 【问题描述】:

上下文

我正在使用 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 的类,它继承自 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】:

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

public class LoginModel : MyPageModel

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

    // the rest of the class implementation

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

【讨论】:

以上是关于我是不是必须在每个剃须刀页面模型中调用数据库?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 asp.net core .NET6(Razor 页面)中的单个 cshtml 中显示来自多个表/模型的数据

.NET Core 无法添加 Razor 页面

剃刀页面是不是位于 mvc 层之上?

空白剃须刀页面,检查评论中是不是存在文章编号

无法将模型值分配给剃须刀页面中的参数

.NET Core 3.1 中使用 Fetch API 的 Ajax 调用