C# 为UserControl填充模型的正确方法是什么?

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

问题不在于MVC,而在于代码体系结构

我有一个局部视图,它采用
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写这篇文章的,但它应该足以让你知道你能做什么


除此之外,我不能对史蒂夫已经说过的话提供任何补充。请注意他的身体。非常强调。

对不起,我几天没来。如果我误导了你,我很抱歉,但是我更新了我的帖子。如果你能看一下,我会很高兴的。我现在已经重新写了我的答案——基本要点是一样的:)