2011-02-22 40 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(视图根文件夹)定义全局对象,并用它们各地意见的项目;)