问题不在于MVC,而在于代码架构。
我的部分视图需要CompanyModel
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<CompanyModel>" %>
<%: Html.TextAreaFor(m => m.Name) %>
<%: Html.TextAreaFor(m => m.Location) %>
CompanyModel
public class CompanyModel
{
[LocalizedDisplayName("Name", NameResourceType = typeof(Resources.Views.CompanyBackground))]
public string Name{get;set;}
[LocalizedDisplayName("Location", NameResourceType = typeof(Resources.Views.CompanyBackground))]
public string Location{get;set;}
public CompanyModel()
{
var info = Project.GetCompanyInfo();
}
}
Project.GetCompanyInfo()
是DAL层,使用Entity Framework
我的问题:填充CompanyModel
的“好”和正确方法是什么?:
解决方案1
创建 CompanyBag
public class CompanyBag
{
public string Name{get;set;}
public string Location{get;set;}
}
和Project.GetCompanyInfo()
将返回CompanyBag
,并在CompanyModel
的.ctor中填写模型。
解决方案2
Project.GetCompanyInfo()
将返回CompanyModel
(因此不需要帮助程序类),我将填充Model
CompanyModel
解决方案3
也许是你的解决方案?
更新
我有LoadController
加载动作,这个动作是一种工厂。它将采用视图列表并通过反射创建它们,然后通过Html.RenderPartial(viewName, viewModel)
加载到页面。因此,CompanyModel
只是视图的一个示例,因此我需要每个视图都是独立的。
所以我的问题是:GetCompanyInfo应该返回CompanyBag
还是CompanyModel
,我会在.ctor中填写模型吗?
谢谢
答案 0 :(得分:2)
好的,问题更新后,这是我更新的答案:)
我假设不同的视图LoadController
填充使用不同类型的ViewModel
,并且每个ViewModel
都填充在域模型的不同部分。以下是我要解决的问题:
首先,将每个部分视图创建为ViewUserControl<TViewModel>
的强类型子类,因此LoadController
可以确定它被告知要创建的每个视图所需的ViewModel
类型
其次,定义一个IViewModelFactory<TViewModel>
接口,并为您需要的每个ViewModel
类型创建一个实现;每个实现都将知道如何从您的域模型中创建和填充其ViewModel
类型。
最后,LoadController
会确定要求创建的每个视图所需的ViewModel
类型,并使用相应的IViewModelFactory
创建它。
为了避免不必要的开销,LoadController
可以find all the available IViewModelFactory
implementations at runtime,并根据他们创建的ViewModel
类型保留静态存储。
总而言之:我会使用CompanyViewModel
从Company
填充CompanyViewModelFactory
,我会使用{{}填充UserViewModel
User
{1}}等等:))
答案 1 :(得分:0)
为什么不使用增强查询对象直接向您提供ViewModel而无需先获取完整实体图?
http://www.yellowfeather.co.uk/2011/03/enhanced-query-objects-with-sharp-architecture/
我意识到Chris为NHibernate写了这个,但它应该足以让你知道你能做什么。
除此之外,我不能提供任何史蒂夫已经说过的话。请注意他的#2。无法强调这一点。