2010-12-15 79 views
1

我有一個母版頁,需要顯示我的數據庫中的一些數據。作爲一個例子,我在頁面中有一個標題,它將顯示用戶擁有的消息/警報的數量。每個控制器都需要將這些數據傳遞給View。在MVC應用程序中執行此操作的最佳方法是什麼?我顯然不想在每個控制器操作中複製代碼。MVC主頁動態數據

回答

2

Darin的答案替代方案是ActionFilterAttribute,它將數據壓入每個Action的ViewData。放置屬性的位置定義了哪些操作可以實現此目的。將它放在根控制器類上意味着所有操作都會得到它。

+0

我想我會嘗試這種方法反對嘗試兒童行動。我不喜歡模型工廠解決方案,因爲我不認爲每個模型都必須從基礎模型類繼承。 – Dismissile 2010-12-15 16:43:33

3

您可以使用子操作。 Phil Haack在這個blog post中做了很好的解釋。通過這種方式,您將擁有一個特定的控制器,用於從存儲庫中獲取數據並將其傳遞到其自己的部分視圖。然後在您的主頁面中,您只需包含以下操作:

<%= Html.Action("index", "somecontroller") %> 

這樣其他控制器不需要將數據傳遞到視圖。它有一個完全獨立的生命週期。

+0

1漂亮且簡單 – hunter 2010-12-15 15:57:53

+0

也許爲了清楚:'<(%)= Html.Action( 「的getMessages」, 「MessagesController」)%>'和'<%= Html.Action( 「GetAlerts」, 「AlertsController」)% >' – hunter 2010-12-15 15:59:06

+1

兒童行爲確實有缺點。他們迫使觀察者太瞭解正在發生的事情。它們也很昂貴,因爲系統必須模擬整個第二個請求。 Rails曾經有類似的功能,但最終被刪除。 – 2010-12-15 15:59:37

2

你可以有所有機型繼承模型:

public abstract class MasterModel 
{ 
    public int NumberOfMessages { get; set; } 
    public string Username { get; set; } 
} 

然後,你可能有某種模型廠將創建被請求的模型:

public class ModelFactory : IModelFactory 
{ 

    private IUserRepository userRepository; 

    public ModelFactory(IUserRepository userRepository) 
    { 
     // Inject a repository .. or a service... 
     this.userRepository = userRepository; 
    } 

    public T Create<T>() where T : MasterModel, new() 
    { 
     var m = new T() 
     { 
      NumberOfMessages = this.userRepository.GetNumberMessages(currentUser) // Get current user somehow... HttpContext 
     }; 
     return m; 

    } 
} 

,那麼你」 d將IModelFactory注入控制器,然後在動作中使用它:

[HttpGet] 
public ViewResult DoSomething() 
{ 
    var model = this.modelFactory.Create<MyActionModel>(); 
    return View(model); 
} 

Th您的主人有MasterModel模型類型,然後可以使用此信息。這樣,所有的邏輯都可以保存在注入工廠的服務/存儲庫中,從而創建每個視圖的模型。這就是我所做的事情,它的成效非常好。