#c# #asp.net-mvc
#c# #asp.net-mvc
Вопрос:
Я новичок в MVC и C # и застрял на этой ошибке. Я не знаю, как это исправить. Любая помощь была бы оценена.
Я пытаюсь перенести репозиторий customer в AccountController, чтобы при создании пользователя вы могли связать его с клиентом из выпадающего списка в представлении register user.
Я получаю ошибку в этой строке в моем контроллере.
public AccountController()
: this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())))
{
}
Ошибка заключается в следующем: контроллер учетной записи не содержит конструктора, который принимает 1 аргумент
Я попробовал несколько исправлений и застрял.
public AccountController(UserManager<ApplicationUser> userManager, ICustomerRepository customerRepository)
{
UserManager = userManager;
customerrepository = customerRepository;
}
Спасибо
Ответ №1:
У вас есть 2 конструктора в AccountController
.
1-й вызывает 2-й.
Второй ожидает 2 параметра: a UserManager<ApplicationUser>
и an ICustomerRepository
.
Это ошибка, потому что вы передаете только одну вещь из 1-го во 2-й.
Вам нужно передать другой параметр во 2-й конструктор.
т. е. предполагаю, что вы хотели сделать что-то подобное:
public AccountController()
: this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())),
new CustomerRepository())
{
}
Комментарии:
1. Этот метод не позволит создать абстрактный класс или интерфейс, ICustomerRepository
2. Я не говорил о новом интерфейсе, вы бы создали новый класс, производный от этого интерфейса.
3. Мои извинения. Я неправильно понял. Это решило проблему, с которой я столкнулся. Я попытался обновить репозиторий, а не базовый класс. Спасибо.
Ответ №2:
Похоже, у вас есть только один конструктор:
public AccountController
{
UserManager<ApplicationUser> _manager ;
public AccountController()
{
this._manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
}
}
Вы должны использовать только : this(xxx)
, когда существует более одного конструктора, и вы не хотите дублировать код между конструкторами.
public AccountController
{
UserManager<ApplicationUser> _manager ;
public AccountController()
:this(new ApplicationDbContext()) //calls the other constructor with a default context
{
}
public AccountController(ApplicationDbContext context)
{
this._manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context);
}
}
Ответ №3:
Похоже, вам нужно указать аргумент для параметра CustomerRepository в вашем конструкторе AccountController.
Возможно, лучшим решением было бы создать свойства в вашем контроллере, которые могут генерировать эти свойства, если они не указаны в конструкторе:
- Получить user manager из OwinContext и
- Создайте новый экземпляр вашего CustomerRepository
Вот пример пользовательского менеджера:
private ApplicationUserManager _userManager;
public ApplicationUserManager UserManager {
get {
return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set {
_userManager = value;
}
}