2016-12-29 3 views
0

Я пытаюсь определить базовый контроллер в проекте ASP.NET MVC -BaseController не содержит конструктор, который принимает аргументы 0

public abstract class BaseController:Controller 
{ 
    protected readonly ExpressDbContext DbContext; 
    string _baseUrl; 

    public BaseController(ExpressDbContext context) 
    { 
     _baseUrl = ConfigurationManager.AppSettings["BaseUrl"].ToString(); 
     DbContext = context; 
    } 

    protected new ViewResult View() 
    { 
     this.ViewBag.BaseUrl = _baseUrl; 
     return base.View(); 
    }  
} 

Тогда унаследовав его от других контроллер-

public class HomeController : BaseController 
{   
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

I увидел некоторые примеры, чтобы объявить базовый контроллер таким образом. Но на этот раз я получаю exception-

BaseController does not contain a constructor that takes 0 arguments 

Я также обязывающее DbContext в Ninject -

kernel.Bind<ExpressMvc.DB.ExpressDbContext>().ToSelf().InRequestScope(); 

Любая вещь, которую я пропустил или из знания?

+2

На вашем 'BaseController', добавьте эту строку кода' общественного BaseController() { } 'и это не так :) – Hackerman

+0

Проверьте, может быть, вам не хватает пакета ninject.web.mvc. – Rajput

ответ

0

Как вы унаследовав от BaseController, в которых вы явно определили конструктор с одним аргументом, конструктор без параметров по умолчанию не создается для BaseController и HomeController не имеет конструктор, определенный таким образом конструктор без параметров создается и ожидает конструктор с той же сигнатурой в базовом классе.

Вы можете либо создать конструктор без параметров базового класса или определить, что явно этот конструктор public BaseController(ExpressDbContext context) должен называться как этот

public class HomeController : BaseController 
{   
    public HomeController():base(ExpressDbContext _ObjectToBePassedToTheBaseConstructor) 
    { 
    } 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 
-1

Используйте пустой конструктор. В противном случае компилятор C# не находит перегрузки, поэтому он выдает ошибку. Он обнаруживает только перегрузки BaseController (ExpressDbContext).

public BaseController() 
    { 

    } 

Если этого не хватает, вы неявно сообщаете компилятору использовать конструктор по умолчанию без параметров. Поскольку такой конструктор не существует в базовом классе, он дает вам эту ошибку.

1

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

public class HomeController : BaseController 
{ 
    public HomeController(ExpressDbContext context) 
     : base(context) 
    { 

    } 

    public ActionResult Index() 
    { 
     return View(); 
    } 
} 
Смежные вопросы