我正在尝试在ASP.NET MVC项目中定义一个基本控制器 -
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();
}
}
我看到一些例子来声明这样的基本控制器。但是这次我得到了例外 -
BaseController does not contain a constructor that takes 0 arguments
我还在Ninject中绑定了一个DbContext -
kernel.Bind<ExpressMvc.DB.ExpressDbContext>().ToSelf().InRequestScope();
我遗漏或缺乏知识的任何事情?
答案 0 :(得分:1)
而不是向抽象基础添加空构造函数,而实际上需要ExpressDbContext
可能不是你想要的,你应该为你的实现添加一个构造函数。
public class HomeController : BaseController
{
public HomeController(ExpressDbContext context)
: base(context)
{
}
public ActionResult Index()
{
return View();
}
}
答案 1 :(得分:0)
当你从BaseController继承你明确定义了一个带有一个参数的构造函数时,没有为BaseController创建一个默认的无参数构造函数,HomeController没有定义构造函数,所以创建了一个无参数构造函数,并期望构造函数在基类中具有相同的签名。
您可以在基类中创建无参数构造函数,也可以明确定义此构造函数public BaseController(ExpressDbContext context)
应该像这样调用
public class HomeController : BaseController
{
public HomeController():base(ExpressDbContext _ObjectToBePassedToTheBaseConstructor)
{
}
public ActionResult Index()
{
return View();
}
}
答案 2 :(得分:-1)
使用空构造函数。否则c#编译器找不到重载因此会抛出错误。它只找到BaseController(ExpressDbContext context)重载。
public BaseController()
{
}
如果缺少这个,则隐式告诉编译器使用没有参数的默认构造函数。因为基类中不存在这样的构造函数,所以它会给你这个错误。