C# 为UserControl填充模型的正确方法是什么?
问题不在于MVC,而在于代码体系结构 我有一个局部视图,它采用C# 为UserControl填充模型的正确方法是什么?,c#,model-view-controller,architecture,s#arp-architecture,C#,Model View Controller,Architecture,S#arp Architecture,问题不在于MVC,而在于代码体系结构 我有一个局部视图,它采用CompanyModel <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<CompanyModel>" %> <%: Html.TextAreaFor(m => m.Name) %> <%: Html.TextAreaFor(m => m.Location) %> Project.Get
CompanyModel
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<CompanyModel>" %>
<%: Html.TextAreaFor(m => m.Name) %>
<%: Html.TextAreaFor(m => m.Location) %>
Project.GetCompanyInfo()
是DAL层,使用实体框架从数据库获取数据
我的问题:填写公司模型的“好”和正确方法是什么
解决方案1
创建公司包
public class CompanyBag
{
public string Name{get;set;}
public string Location{get;set;}
}
而Project.GetCompanyInfo()
将返回CompanyBag
并在CompanyModel
的.ctor中填充模型
解决方案2
Project.GetCompanyInfo()
将返回CompanyModel
(因此不需要助手类),我将在CompanyModel的.ctor中填充模型
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<CompanyModel>" %>
<%: Html.TextAreaFor(m => m.Name) %>
<%: Html.TextAreaFor(m => m.Location) %>
解决方案3
也许你的解决方案
更新:
我有LoadController
和Load动作,这个动作有点像工厂。它将获取视图列表并通过反射创建它们,然后通过Html.RenderPartial(viewName,viewModel)
加载到页面。所以,CompanyModel
只是视图的一个示例,因此我需要每个视图都是独立的
所以我的问题是:GetCompanyInfo应该返回CompanyBag
还是CompanyModel
,然后我将在.ctor中填充模型
谢谢好的,在问题更新之后,这是我的更新答案:)
我假设不同的视图LoadController
采用不同类型的ViewModel
,并且每个ViewModel
都是从域模型的不同部分填充的。下面是我如何解决这个问题的:
首先,将每个局部视图创建为ViewUserControl
的强类型子类,这样LoadController
就可以找出它需要为每个视图创建的ViewModel
类型
其次,定义一个IViewModelFactory
接口,并为所需的每个ViewModel
类型创建一个实现;每个实现都知道如何从域模型创建和填充其ViewModel
类型
最后,LoadController
将为要求其创建的每个视图确定所需的ViewModel
类型,并使用适当的IViewModelFactory
创建它
为了避免不必要的开销,LoadController
可以根据它们创建的ViewModel
类型对它们进行静态存储
总而言之:我将使用公司视图模型工厂从公司填充公司视图模型,我将使用用户视图模型工厂从用户填充用户视图模型,等等:)为什么不使用增强的查询对象直接向您提供ViewModel,而无需首先获取完整的实体图
我知道Chris是为NHibernate写这篇文章的,但它应该足以让你知道你能做什么
除此之外,我不能对史蒂夫已经说过的话提供任何补充。请注意他的身体。非常强调。对不起,我几天没来。如果我误导了你,我很抱歉,但是我更新了我的帖子。如果你能看一下,我会很高兴的。我现在已经重新写了我的答案——基本要点是一样的:)