Asp.net mvc MVC中的ViewModel访问数据的正确方法
有人能告诉我这是否是创建viewmodel的正确方法吗。我使用的是Ninject,使视图模型工作的唯一方法是使用下面的代码 此外,除非创建第二个界面,否则我似乎无法将数据从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
不,这不是构建视图模型的正确方法。视图模型中不应包含任何数据访问逻辑。这是模型的责任 您应该改为使用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);
}
}