簡體   English   中英

ASP.NET主頁是否應該從視圖中獲取其數據?

[英]Should an ASP.NET masterpage get its data from the view?

我一直在玩ASP.NET MVC,其中包含一個包含母版頁的網站。

我創建了一個名為ProductThumbnailControl的MVC用戶控件。 用戶控件顯示產品和小縮略圖圖像。 View是一個ViewProduct視圖,它顯示完整的產品信息 - usercontrol只是一個關閉網站的UI元素。

 public partial class ProductThumbnailControl :
                      System.Web.Mvc.ViewProductControl<ViewProductsModel>
 {

 }

我讀了一篇博客文章 ,展示了用戶控件如何使用ViewData 我了解到用戶控件可以從父視圖中自動獲取其模型。 由於它使用相同的數據,因此View不需要向用戶控件顯式傳遞任何內容,從而使標記和代碼更清晰。

所以現在我已經知道Master Page使用與頁面相同的ViewData 這意味着Master Page本身並沒有真正的模型來幫助自我渲染。

什么是Master Page首先獲取數據的正確方法?

我想過嘗試以下幾點?

你可以有一個SiteModel

//Arbitrary properties for example
class SiteModel 
{
    public string PartnerId {get; set;}
    public ShoppingCart ShoppingCartContents {get; set;}    
    public string CurrentUserId {get; set;}
}

View繼承自:

class ViewProductModel : SiteModel 
{
    public Product Product {get; set;}
}

SiteModel將由主頁面使用。 如果需要,視圖可以使用來自它的數據 - 如果他們需要在某處顯示當前用戶的電子郵件。

這是一個可怕的想法嗎?

主頁是否應該從需要的任何地方獲取數據?

如果我想在masthead包含用戶控件怎么辦?

它會從哪里得到它的ViewData ,因為whle頁面只有一個ViewData對象?

我是否必須使用我討厭的這種可怕的語法並將主頁的用戶控件傳遞給顯式模型?

Html.RenderUserControl("~/Views/Account/UserControls/Header.ascx",
  null, new { SelectedItem = "Profile" })

解決這種情況的最佳方法是什么?

我們的母版頁從視圖中獲取數據。 我們對視圖使用強類型視圖名稱 ,在該實現的方法中,我們還添加了每個頁面需要來自持久對象的標准視圖數據(例如應用程序菜單結構信息,用戶信息顯示在屏幕上等等)。

這樣做的缺點是使得我們的母版頁的視圖數據不像模型對象那樣強類型,但它對我們來說非常有效。

你的想法也很好。 由於Master頁面的概念類似於繼承的概念,為什么不使用繼承來設置模型對象。 您可以更進一步,創建一個模型工廠,生成模型對象並設置基類數據。

看起來我的解決方案非常類似於微軟的推薦,只有一個關鍵的例外。 我創建了一個ViewData基類,他們創建了一個Controller基類 - 這更有意義。

然而,似乎這兩種想法都可以(並且應該)協同工作。 下面的MS教程使用字典來存儲視圖數據,因此如果你有一個強類型模型,你還需要一個基類。

Microsoft MVC教程

我將創建一個ShoppingCart控制器(或每個關注點的單獨控制器),並使用Future DLL中的RenderAction渲染使用它們的用戶控件,可以從www.codeplex.com/asp.net下載。 它是ASP.NET MVC源代碼的一部分。

使用基本控制器或“站點模型”將太多事物耦合在一起,從而產生測試和維護噩夢。

暫無
暫無

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

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