BaseController不包含带0个参数的构造函数

时间:2016-12-29 14:29:59

标签: asp.net-mvc asp.net-mvc-5

我正在尝试在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();

我遗漏或缺乏知识的任何事情?

3 个答案:

答案 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()
    {

    }

如果缺少这个,则隐式告诉编译器使用没有参数的默认构造函数。因为基类中不存在这样的构造函数,所以它会给你这个错误。