2011-02-22 41 views
3

在我的web應用程序中,我將菜單放在局部視圖上並從Site.Master加載它。asp-net mvc視圖中的全局變量

現在想象一個類似gmail的場景,其中您的菜單中有一個收件箱(n)項,其中n是未發送郵件的數量。有沒有一種簡單的方法將n變量傳遞給所有使用Site.Master主頁的視圖?

喜歡的東西:

<%: Html.ActionLink("Inbox - " + ViewData["n"], "Index", "Home") %> 
+0

[Access Viewbag屬性在所有視圖上]的可能重複](https://stackoverflow.com/questions/273085 24/access-viewbag-property-on-all-views) – tecla 2017-06-16 23:56:43

回答

4

您可以使用子操作以及Html.Action and Html.RenderAction助手。所以讓我們來詳細說明一個例子。

一如往常你開始將代表你想顯示在這個特定視圖(或在這種情況下,局部視圖)的信息的視圖模型:

public class InboxViewModel 
{ 
    public int NumberOfUnreadMails { get; set; } 
} 

然後控制器:

public class InboxController : Controller 
{ 
    public ActionResult Index() 
    { 
     InboxViewModel model = ... // Repository, DI into the controller, ... 
     return View(model); 
    } 
} 

然後相應的視圖(~/Views/Inbox/Index.ascx):

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> 
<%: Html.ActionLink("Inbox - " + Model.NumberOfUnreadMails, "Index", "Home") %> 

終於第嵌入在你的主網頁,使其適用於所有的意見:

<div class="leftMenu"> 
    <% Html.RenderAction("Index", "Inbox"); %> 
</div> 
+0

這工作得很好。不知道RenderAction,只有RenderPartial。謝謝您的幫助。 – dcarneiro 2011-02-23 09:56:16

0

考慮保持這ViewData[]。這就是您可以輕鬆地在不同(部分)視圖之間共享數據的方式。

控制器:

ViewData["UnreadMessages"] = "5"; 

所有視圖可以簡單地訪問此屬性。

+0

問題在於我必須在我所有的操作上設置ViewData [「UnreadMessages」]。我正在尋找一種更清潔的方法。 – dcarneiro 2011-02-23 09:45:51

0

你應該能夠做到這一點,你沒有在本例中,只要告訴它使值的字符串的方式,因爲視圖數據回報對象,只是拆箱作爲一個字符串的數字,然後你可以使用它,就像是

<%: Html.ActionLink("Inbox - " +ViewData["n"].ToString(), "Index", "Home") %> 
+0

這個問題是我必須在我所有的操作上設置ViewData [「UnreadMessages」]。我正在尋找一種更清潔的方法 – dcarneiro 2011-02-23 10:30:29

1

只是_ViewStart.cshtml(視圖根文件夾)定義全局對象,並用它們各地意見的項目;)