填充用户控件模型的正确方法是什么
本文关键字:方法 是什么 用户 控件 模型 填充 | 更新日期: 2023-09-27 17:58:09
问题不是关于MVC,而是关于代码架构。
我有一个部分观点,需要CompanyModel
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<CompanyModel>" %>
<%: Html.TextAreaFor(m => m.Name) %>
<%: Html.TextAreaFor(m => m.Location) %>
公司型号
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 层,使用实体框架从数据库获取数据
我的问题:填充CompanyModel
的"好"和正确的方法是什么?
解决方案 1
创建公司包
public class CompanyBag
{
public string Name{get;set;}
public string Location{get;set;}
}
Project.GetCompanyInfo()
将返回CompanyBag
,并在 CompanyModel
的 .ctor 中填充模型。
解决方案 2
Project.GetCompanyInfo()
将返回CompanyModel
(因此不需要帮助程序类(,我将在 .ctor 中填充Model
CompanyModel
解决方案 3
也许是你的解决方案?
更新:我LoadController
加载操作,此操作有点像工厂。它将获取视图列表,并通过反射创建它们,然后通过Html.RenderPartial(viewName, viewModel)
加载到页面。因此,CompanyModel
只是视图的一个例子,因此我需要每个视图都是独立的。
所以我的问题是:GetCompanyInfo应该返回CompanyBag
还是CompanyModel
,我将在.ctor中填写模型?
谢谢
,在问题更新之后,这是我更新的答案:)
我假设填充LoadController
的不同视图采用不同类型的ViewModel
,并且每个ViewModel
都是从域模型的不同部分填充的。以下是我如何解决这个问题:
首先,将每个分部视图创建为 ViewUserControl<TViewModel>
的强类型子类,这样LoadController
就可以确定它被告知要创建的每个视图需要哪种ViewModel
类型。
其次,定义一个IViewModelFactory<TViewModel>
接口,并为所需的每种ViewModel
类型创建一个实现;每个实现将知道如何从域模型创建和填充其ViewModel
类型。
最后,LoadController
会找出要求创建的每个视图所需的ViewModel
类型,并使用适当的IViewModelFactory
来创建它。
为了避免不必要的开销,LoadController
可以在运行时找到所有可用的IViewModelFactory
实现,并根据它们创建的ViewModel
类型保留它们的静态存储。
总而言之:我会使用 CompanyViewModelFactory
从Company
填充CompanyViewModel
,我会使用 UserViewModelFactory
从User
填充UserViewModel
,等等:)
为什么不使用增强型查询对象将视图模型直接交付给您,而不必先获取完整实体图?
http://www.yellowfeather.co.uk/2011/03/enhanced-query-objects-with-sharp-architecture/
我意识到克里斯为NHibernate写了这篇文章,但它应该足以让你知道你能做什么。
除此之外,我不能提供任何关于史蒂夫已经说过的话。请仔细注意他的#2。怎么强调都不为过。