我有一个页面,由许多用户控件组成。这个页面的视图模型相当复杂。
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架构的一部分。
IQueryable<Something>
,并且(2)你的持久层有一流的LINQ实现,那么这将非常有效。由于你没有提供关于这方面的详细信息,我只能引用一个博客文章,在那里我更详细地解释了这个想法。示例不使用存储库,但只要你的存储库返回IQueryable
,这个想法就是完全相同的。 http://blogs.teamb.com/craigstuntz/2009/12/31/38500/ 无论如何,请看一下,看看它是否有帮助。 - Craig Stuntz