Должен ли я вызывать базу данных в каждой модели страницы бритвы? - PullRequest
0 голосов
/ 11 апреля 2019

Контекст

Я работаю с 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
    {
    ...
    }

Но выдает эту ошибку:

"Нет аргумента, чтосоответствует требуемому параметру формата 'db' из 'MyPageModel.MyPageModel (AppDbContext, UserManager, SigInManager)' "

1 Ответ

2 голосов
/ 11 апреля 2019

Ваша базовая модель страницы имеет конструктор с параметрами, но наследующие классы не используют этот конструктор. Они должны предоставить значения этому конструктору:

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

    // the rest of the class implementation
}

Им не нужна собственная реализация конструктора, но, по крайней мере, им нужно получить необходимые аргументы конструктора и передать их конструктору базового класса.

...