Asp.net mvc 如何将对象传递到VIewModel的构造函数中?ASP.NET MVC 3,Ninject

Asp.net mvc 如何将对象传递到VIewModel的构造函数中?ASP.NET MVC 3,Ninject,asp.net-mvc,ninject,viewmodel,Asp.net Mvc,Ninject,Viewmodel,我一直在使用Bob Cravens博客中描述的存储库模式来创建我的应用程序,但我有点新,仍然在寻找解决方法。我想将DataService对象注入ViewModel的构造函数中,这样我就可以创建一个SelectList对象,并在视图中创建一个下拉框。然而,我似乎无法让绑定正常工作,每次我创建ViewModel时,它都会查找/执行无参数构造函数!我已经尝试了各种方法,在这里使用答案,但都没有用。非常感谢您的帮助 视图模型: public class ServerCreateViewModel {

我一直在使用Bob Cravens博客中描述的存储库模式来创建我的应用程序,但我有点新,仍然在寻找解决方法。我想将DataService对象注入ViewModel的构造函数中,这样我就可以创建一个SelectList对象,并在视图中创建一个下拉框。然而,我似乎无法让绑定正常工作,每次我创建ViewModel时,它都会查找/执行无参数构造函数!我已经尝试了各种方法,在这里使用答案,但都没有用。非常感谢您的帮助

视图模型:

public class ServerCreateViewModel
{
    public SelectList Companies { get; private set; }

    public ServerCreateViewModel()
    {

    }

    public ServerCreateViewModel(DataService _dataService)
    {

        Companies = new SelectList(_dataService.Companies.All(), "Id", "CompanyName");

    }
Ninject模块:

        Bind<DataService>().ToSelf()
            .InRequestScope();

        var _dataService = Kernel.Get<DataService>();

        Bind<ServerCreateViewModel>()
            .ToSelf()
            .WithConstructorArgument("_dataService", _dataService);

        //Bind<ServerCreateViewModel>()
        //    .ToSelf()
        //    .WithConstructorArgument("_dataService", ctx => ctx.Kernel.Get<DataService>());

你不应该那样做

视图模型(实际上是所有模型)应该只是包含一些数据的存储桶。它们不应该依赖于任何业务逻辑、服务等

控制器负责填充模型并将其传递给视图

public class ServerCreateViewModel
{
    public SelectList Companies { get; private set; }
}

public ActionResult Create()
{
    var viewModel = new ServerCreateViewModel
    {
        Companies = new SelectList(_dataService.Companies.All(), "Id", "CompanyName")
    };

    return View(viewModel);
} 

数据服务应该注入控制器,而不是视图模型。

谢谢,我最初就是这样做的,但我完全不确定这样做是否正确!我很感激你这么说。
public class ServerCreateViewModel
{
    public SelectList Companies { get; private set; }
}

public ActionResult Create()
{
    var viewModel = new ServerCreateViewModel
    {
        Companies = new SelectList(_dataService.Companies.All(), "Id", "CompanyName")
    };

    return View(viewModel);
}