使用接口暗示您的視圖模型之間有一些共同點的答案肯定會有助於回答您的問題中的一些觀點。
然而,我會問,「重構」你的行動是多麼明智,以支持不同數據結構的多個視圖。
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