我有一个由许多用户控件组成的页面。该页面的视图模型相当复杂。在ASP.NET MVC中保留ViewModels
public class ComplexViewModel
{
public ObjectA ObjectAProperty { get; set; }
public List<Things> ListOfThings { get; set; }
public List<ThingCategories> ListOfThingCategories { get; set; }
public List<ThingTypes> ListOfThingTypes { get; set; }
public List<ThingOptions> ListOfThingOptions { get; set; }
public int ChosenThingCategoryId { get; set; }
public int ChosenThingTypeId { get; set; }
public int ChosenThingOptionId { get; set; }
public OtherObject ObjectData { get; set; }
}
此页面还包含用于过滤的信息,排序的PostModel等
public class SimplePostModel
{
public int ChosenThingCategoryId { get; set; }
public int ChosenThingTypeId { get; set; }
public int ChosenThingOptionId { get; set; }
public int ChosenThingFilterTypeId { get; set; }
public int ChosenThingSortTypeId { get; set; }
public int ChosenThingOtherId { get; set; }
public int ChosenThingMoreId { get; set; }
public int ChosenThingOMGId { get; set; }
}
简单PostModel被验证,然后控制器打开3+库使得多个呼叫到每个并生成视图模型。说至少我的控制器行动已经变得相当大。
这是迄今为止我工作过的最复杂的页面,我很难决定如何使它更简单。
我的第一个想法是创建一个视图模型工厂,在绑定验证后,将调用存储库并返回ViewModel。
然后我想到了创建一个自定义模型绑定器来验证PostModel,然后在一个步骤中对ViewModel进行水合。
所以我的问题是你如何水合复杂的视图模型?
而我写这篇文章时,我想到了使用Html.RenderAction并为构成页面这个野兽的每个用户控件创建一个模型。
更新:
的仓库拨打电话到WCF服务中,该应用程序是一个更大的SOA拱的一部分。
我对此使用LINQ预测。如果(1)您的存储库返回'IQueryable',并且(2)您的持久层具有一流的LINQ实现,这将很有用。既然你没有提供这方面的细节,我只想把你引到一个博客文章,我会更详细地解释这个想法。这些示例不使用存储库,但只要您的存储库返回'IQueryable',这个想法就完全相同。 http://blogs.teamb.com/craigstuntz/2009/12/31/38500/无论如何,请看看它是否有帮助。 –
2010-01-20 13:55:05