簡體   English   中英

ASP.NET MVC:使用基本強類型視圖填充派生的強類型視圖

[英]ASP.NET MVC: Populating Derived Strongly Typed View with Base Strongly Typed View

在我的申請中,我有不同的頁面:聯系我們,關於我們,主頁

它們都具有需要填充視圖的相同基本元素:

  • 頁面標題
  • 元描述
  • 用戶信息

但是在每個頁面上,它們都有一些不同的元素:

聯系我們

  • 聯系信息模型
  • 聯系表格模型

關於我們

  • 擴展的用戶信息模型

  • 主頁文字屬性

它們都被路由到相同的Controller Action Method,因為除了根據頁面類型填充“額外”信息之外,大多數功能都是類似的。

到目前為止,我已經做了以下事情:

PageDetailViewData pageDetailViewData = new PageDetailViewData {Title = title, Desc = desc....}

我跟着這個:

                switch ((PageType)page.PageType)
            {
                case (PageType.Contact):
                    return View("ContactUsDetails", pageDetailViewData);
                default:
                    return View(pageDetailViewData);
            }

問題是如何填充“額外”信息? 我不確定我是否會以正確的方式做這件事。 任何有關更好地構建邏輯流程的見解都將受到贊賞。

使用接口來暗示視圖模型之間的某些共性的答案肯定會有助於回答問題中的一些要點。

但是,我想問一下,“重構”你的Action以支持不同數據結構的多個視圖是多么明智。

MVC控制器操作通常表示收集生成預期視圖所需的特定數據所需的最少代碼量。 單個操作返回相同模型數據的不同視圖(例如Html視圖或移動視圖)並不是完全不常見,但通過改變數據結構和生成的視圖會引入一些問題。

特別是你違反了單一責任原則等常見的最佳實踐,並使你的代碼變得更加復雜 - 而無痛測試和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...
}

有幾種方法可以重構視圖模型代碼的生成,但這是一種可能的模式。

我很欣賞這個答案確實有一定的意見,但我會考慮采取單獨的行動作為最佳實踐。

希望有所幫助。

你問題的標題幾乎可以給你答案。 您可以使用某種形式的多態來完成此任務。 您可以使用共享屬性定義基類,或者使用以下類似的接口:

public interface ICommonPage
{
    string Title { get; }
    string MetaDescription { get; }
    string UserInformation { get; }
}

然后定義三個強類型的ViewModel類,它們都實現此接口(或從基類派生):

  • ContactUsViewModel:ICommonPage
  • AboutUsViewModel:ICommonPage
  • HomeViewModel:ICommonPage

在每個ViewModel類上,添加這些視圖所需的額外屬性。

在Controller Action中,您需要打開PageType以選擇正確的ViewModel並使用數據填充它。

您還需要為每個ViewModel類創建強類型的三個不同視圖(.aspx)。

如果您具有公共數據的共享呈現,則可以將其提取到鍵入ICommonPage的強類型UserControl(.ascx)中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM