Asp.net mvc MVC中的ViewModel访问数据的正确方法

Asp.net mvc MVC中的ViewModel访问数据的正确方法,asp.net-mvc,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 4,有人能告诉我这是否是创建viewmodel的正确方法吗。我使用的是Ninject,使视图模型工作的唯一方法是使用下面的代码 此外,除非创建第二个界面,否则我似乎无法将数据从viewmodel传递到控制器 下面的代码确实有效,但是阅读我看到的所有示例,我似乎从我的域层复制了很多代码 ---------------------代码数据访问层------ 不,这不是构建视图模型的正确方法。视图模型中不应包含任何数据访问逻辑。这是模型的责任 您应该改为使用Ninject将IGetSearchResult

有人能告诉我这是否是创建viewmodel的正确方法吗。我使用的是Ninject,使视图模型工作的唯一方法是使用下面的代码

此外,除非创建第二个界面,否则我似乎无法将数据从viewmodel传递到控制器

下面的代码确实有效,但是阅读我看到的所有示例,我似乎从我的域层复制了很多代码

---------------------代码数据访问层------


不,这不是构建视图模型的正确方法。视图模型中不应包含任何数据访问逻辑。这是模型的责任

您应该改为使用Ninject将
IGetSearchResults
实例注入控制器,而不是让
GetSearchResultsViewModel
视图模型将其作为构造函数依赖项。实际上,您根本不需要这个
GetSearchResultsViewModel
。您已经有了名为
DisplaySearchResultsViewModel
的正确视图模型。然后,控制器负责使用数据访问层并构建此视图模型

例如:

public class SomeController : Controller
{
    private readonly IGetSearchResults repository;
    public SomeController(IGetSearchResults repository)
    {
        this.repository = repository;
    }

    public ActionResult SomeAction(string q, string option, int pagenumber)
    {
        // query your data access layer and build the view model that you will
        // pass to the view
        IEnumerable<DisplaySearchResultsViewModel> model = this.repository
            .SearchResults(q, option, pagenumber)
            .AsEnumerable()
            .Select(details => new DisplaySearchResultsViewModel
            {
                Title = Sanitizer.GetSafeHtmlFragment(details.Title),
                Description = Sanitizer.GetSafeHtmlFragment(details.Description).ToLower(),
                URL = Sanitizer.GetSafeHtmlFragment(details.URL)
            })
            .ToList();

         return View(model);
    }
}
public类SomeController:Controller
{
专用只读IGetSearchResults存储库;
公共SomeController(IGetSearchResults存储库)
{
this.repository=存储库;
}
公共ActionResult SomeAction(字符串q、字符串选项、整数页码)
{
//查询您的数据访问层并构建您将创建的视图模型
//传递到视图
IEnumerable model=this.repository
.搜索结果(q、选项、页码)
.可计算的()
.选择(详细信息=>new DisplaySearchResultsViewModel
{
Title=消毒剂.getSafeThmlFragment(details.Title),
Description=Sanitizer.getSafeThmlFragment(details.Description).ToLower(),
URL=Sanitizer.getSafeThmlFragment(details.URL)
})
.ToList();
返回视图(模型);
}
}

不,这不是构建视图模型的正确方法。视图模型中不应包含任何数据访问逻辑。这是模型的责任

您应该改为使用Ninject将
IGetSearchResults
实例注入控制器,而不是让
GetSearchResultsViewModel
视图模型将其作为构造函数依赖项。实际上,您根本不需要这个
GetSearchResultsViewModel
。您已经有了名为
DisplaySearchResultsViewModel
的正确视图模型。然后,控制器负责使用数据访问层并构建此视图模型

例如:

public class SomeController : Controller
{
    private readonly IGetSearchResults repository;
    public SomeController(IGetSearchResults repository)
    {
        this.repository = repository;
    }

    public ActionResult SomeAction(string q, string option, int pagenumber)
    {
        // query your data access layer and build the view model that you will
        // pass to the view
        IEnumerable<DisplaySearchResultsViewModel> model = this.repository
            .SearchResults(q, option, pagenumber)
            .AsEnumerable()
            .Select(details => new DisplaySearchResultsViewModel
            {
                Title = Sanitizer.GetSafeHtmlFragment(details.Title),
                Description = Sanitizer.GetSafeHtmlFragment(details.Description).ToLower(),
                URL = Sanitizer.GetSafeHtmlFragment(details.URL)
            })
            .ToList();

         return View(model);
    }
}
public类SomeController:Controller
{
专用只读IGetSearchResults存储库;
公共SomeController(IGetSearchResults存储库)
{
this.repository=存储库;
}
公共ActionResult SomeAction(字符串q、字符串选项、整数页码)
{
//查询您的数据访问层并构建您将创建的视图模型
//传递到视图
IEnumerable model=this.repository
.搜索结果(q、选项、页码)
.可计算的()
.选择(详细信息=>new DisplaySearchResultsViewModel
{
Title=消毒剂.getSafeThmlFragment(details.Title),
Description=Sanitizer.getSafeThmlFragment(details.Description).ToLower(),
URL=Sanitizer.getSafeThmlFragment(details.URL)
})
.ToList();
返回视图(模型);
}
}

更改了代码,从未将域和viewmodel分开,将域代码在不同的类中分离到viewmodel,我的错误没有表明将这些层分开以获得更好的可读性是好的,但我能够立即看到在视图模型中使用数据访问层的错误,这是不正确的。嗨,Darin,我过去就是这样做的,但在我读过的一些书中,作者说保持控制器的亮度,并移动所有的显示,例如,在我的例子中,将数据清理到viewmodel中。当一些书说一件事而另一本书说另一件事时,确实有点让人困惑。很难决定在显示数据时应在视图内部执行哪种Gosanizing操作,这甚至不应成为服务器端逻辑的一部分。更改代码,从不将域和viewmodel分开,将单独类中的域代码转换为viewmodel,我的错误并没有表明为了更好的可读性而分离这些层是好的,但我能够立即看到在视图模型中使用数据访问层的错误,这是不正确的。嗨,Darin,我过去就是这样做的,但在我读过的一些书中,作者说保持控制器的亮度,并移动所有的显示,例如,在我的例子中,将数据清理到viewmodel中。当一些书说一件事而另一本书说另一件事时,确实有点让人困惑。当您显示数据时,很难决定应该在视图内部执行哪种Gosanizing方式,这甚至不应该是服务器端逻辑的一部分。
var DisplaySearchResults    = _IGSR.SearchResultsViewModel(cleanText, "1", 1);
public class SomeController : Controller
{
    private readonly IGetSearchResults repository;
    public SomeController(IGetSearchResults repository)
    {
        this.repository = repository;
    }

    public ActionResult SomeAction(string q, string option, int pagenumber)
    {
        // query your data access layer and build the view model that you will
        // pass to the view
        IEnumerable<DisplaySearchResultsViewModel> model = this.repository
            .SearchResults(q, option, pagenumber)
            .AsEnumerable()
            .Select(details => new DisplaySearchResultsViewModel
            {
                Title = Sanitizer.GetSafeHtmlFragment(details.Title),
                Description = Sanitizer.GetSafeHtmlFragment(details.Description).ToLower(),
                URL = Sanitizer.GetSafeHtmlFragment(details.URL)
            })
            .ToList();

         return View(model);
    }
}