使用接口暗示您的视图模型之间有一些共同点的答案肯定会有助于回答您的问题中的一些观点。
然而,我会问,“重构”你的行动是多么明智,以支持不同数据结构的多个视图。
MVC控制器操作通常代表收集生成预期视图所需的特定数据所需的最少代码量。单个动作返回同一模型数据的不同视图(例如Html视图或Mobile视图)并不罕见,但通过改变数据结构和视图会产生一些问题。
特别是,您违反了常见的最佳实践,如Single Responsibility Principle,并使您的代码更加复杂以进行测试 - 无痛测试和TDD是ASP.Net MVC的重大胜利的一部分。
就我个人而言,我会有一个单独的行动。
就你的视图模型而言,如果这是一个数据库,你会怎么做? 你会分开查询单独的数据权利?
用户的个人资料信息将与页面元数据信息分开查询。这可能是由于许多原因造成的,这些原因可能包括高速缓存数据的某些部分而不是其他数据。
因此,与上述建议,你的代码可能是这样的(注意:此代码不能在Visual Studio编写,是完全可能的语法问题):
public interface IMetaDataViewModel
{
PageMetaData MetaData{get; set;}
}
public class HomeViewModel : IMetaDataViewModel
{
public PageMetaData MetaData{get; set;}
public string HomePageText{get; set;}
}
//other view models go here....
public class CommonPagesController : Controller
{
private MetaDataProvider _metaProvider = new MetaDataProvider();
private PageDataProvider _pageDataProvider = new PageDataProvider();
private ContactDataProvider _contactDataProvider = new ContactDataProvider();
public ActionResult Home()
{
var viewModel = new HomeViewModel
{
MetaData = _metaProvider.GetPageMeta();
HomePageText = _pageDataProvider.GetPageData();
};
return View(viewModel);
}
public ActionResult Contact()
{
var viewModel = new ContactViewModel
{
MetaData = _metaProvider.GetPageMeta();
ContactFormData = _contactDataProvider.GetData();
};
return View(viewModel);
}
//you get the picture...
}
有几种方法,你也可以重构视图模型代码的生成,但这是一种可能的模式。
我明白,这个答案确实有一定的意见,但我会考虑分开行动是最好的做法。
希望有所帮助。
感谢您的详细回复。所有路由到同一个Action Handler的原因是因为传入的“Action”是动态的,并且只有在查询数据库时才确定页面类型。例如:site.com/ABC site.com/contact-ABC ...我只知道依赖于域之后的密钥取决于哪个视图。 – TimLeung 2009-09-24 03:24:18
也许您需要的抽象不在控制器级别,但可能在Controller Factory级别? 如果你想坚持强类型的视图路线(通常是一件好事),那么你将不得不编写自定义代码来填充每个视图模型。 听起来你正在编写一个CMS风格的应用程序。这可能是我一次积极辩论强类型观点的优点的时候。我还没有看到......但值得考虑。 – 2009-09-24 08:37:28