填充用户控件模型的正确方法是什么

本文关键字:方法 是什么 用户 控件 模型 填充 | 更新日期: 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类型保留它们的静态存储。

总而言之:我会使用 CompanyViewModelFactoryCompany填充CompanyViewModel,我会使用 UserViewModelFactoryUser填充UserViewModel,等等:)

为什么不使用增强型查询对象将视图模型直接交付给您,而不必先获取完整实体图?

http://www.yellowfeather.co.uk/2011/03/enhanced-query-objects-with-sharp-architecture/

我意识到克里斯为NHibernate写了这篇文章,但它应该足以让你知道你能做什么。

除此之外,我不能提供任何关于史蒂夫已经说过的话。请仔细注意他的#2。怎么强调都不为过。