2008-09-17 80 views
97

什麼是你的方式傳遞數據到主頁(使用ASP.NET MVC)沒有打破MVC規則?個人而言,我更喜歡編碼抽象控制器(基本控制器)或傳遞給所有視圖的基類。傳遞數據到主頁在ASP.NET MVC

+1

我寫了一篇關於如何管理的指南:http://www.britishdeveloper.co.uk/2010/06/mvc-pass-viewmasterpage-model.html應該有幫助 – BritishDeveloper 2011-06-21 20:38:20

回答

75

如果你喜歡你的視圖有強類型的視圖數據類,這可能適合你。其他解決方案可能更多正確但這是一個很好的設計和實用性之間的平衡恕我直言。

母版頁需要包含相關的唯一信息的強類型的視圖數據類吧:

public class MasterViewData 
{ 
    public ICollection<string> Navigation { get; set; } 
} 

使用母版頁每個視圖需要包含的信息,並從母版頁獲得一個強類型的視圖數據類查看數據:

public class IndexViewData : MasterViewData 
{ 
    public string Name { get; set; } 
    public float Price { get; set; } 
} 

因爲我不想單獨的控制器知道把在一起的母版頁數據什麼我封裝了邏輯到被傳遞到每個控制器廠:

public interface IViewDataFactory 
{ 
    T Create<T>() 
     where T : MasterViewData, new() 
} 

public class ProductController : Controller 
{ 
    public ProductController(IViewDataFactory viewDataFactory) 
    ... 

    public ActionResult Index() 
    { 
     var viewData = viewDataFactory.Create<ProductViewData>(); 

     viewData.Name = "My product"; 
     viewData.Price = 9.95; 

     return View("Index", viewData); 
    } 
} 

繼承匹配主要視圖關係,但是當涉及渲染partials /用戶控件時,我會將其視圖數據組合到頁面視圖數據中。

public class IndexViewData : MasterViewData 
{ 
    public string Name { get; set; } 
    public float Price { get; set; } 
    public SubViewData SubViewData { get; set; } 
} 

<% Html.RenderPartial("Sub", Model.SubViewData); %> 

這僅是示例代碼,並不打算按原樣編譯。專爲ASP.Net MVC 1.0而設計。

+4

這是Scott推薦的方法Gutherie,所以我不得不同意。 – 2009-09-21 21:34:18

+0

@Simon Fox - 有一個鏈接到scottgu的推薦?找不到它。 – orip 2009-12-15 14:10:33

+4

http://weblogs.asp.net/scottgu/archive/2007/12/06/asp-net-mvc-framework-part-3-passing-viewdata-from-controllers-to-views.aspx#5415732 – 2010-03-18 12:05:23

6

抽象控制器是一個好主意,我還沒有找到更好的方法。我很想看看其他人也做了什麼。

0

Request.Params對象是可變的。作爲請求處理週期的一部分,爲它添加標量值非常簡單。從視角來看,這些信息可能已經在QueryString或FORM POST中提供。 hth

0

我東西,另一種好辦法是可以爲查看一些屬性像一些接口的ParentView創建界面,讓您可以使用它無論對於其需要的參考控制頁面(父控件)以及應該從視圖訪問的主視圖。

2

我發現你傳遞給視圖的所有模型對象的共同父對象非常有用。

無論如何,頁面之間始終會存在一些常見的模型屬性。

20

編輯

Generic Error已經下面提供一個更好的答案。請閱讀它!

原來的答案

微軟實際上已經張貼在the "official" way一個條目來處理這個問題。這提供了一個循序漸進的解釋他們的推理。

總之,他們推薦使用抽象控制器類,但請親自看看。

0

其他解決方案缺乏優雅,花費時間太長。所以很明顯

<script runat="server" type="text/C#"> 
    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 
     MasterModel = SiteMasterViewData.Get(this.Context); 
    } 

    protected SiteMasterViewData MasterModel; 
</script> 

我有SiteMasterViewData這種靜態get()方法返回SiteMasterViewData:我幾乎整整一年後這樣做很傷心,貧困的事情道歉。

59

我更喜歡將主視圖的數據驅動片斷分解成部分並使用Html.RenderAction。這個擁有廣受歡迎的視圖模型繼承方法幾個明顯的優勢:

  1. 母版視圖的數據是完全從「普通」視圖模型脫鉤。這是繼承的組合,並導致更容易更改的更鬆散耦合的系統。
  2. 主視圖模型由完全獨立的控制器動作構建。 「常規」操作不需要擔心這一點,也不需要一個視圖數據工廠,這對我的口味來說看起來過於複雜。
  3. 如果您碰巧使用像AutoMapper這樣的工具將您的域映射到您的視圖模型,您會發現配置起來更容易,因爲當它們不繼承主視圖數據時,視圖模型將更接近您的域模型。
  4. 使用獨立的主數據操作方法,您可以輕鬆地將輸出緩存應用於頁面的某些區域。通常情況下,主視圖包含的數據更改頻率比主頁面內容更少。