asp-net mvc视图中的全局变量

时间:2011-02-22 18:07:54

标签: asp.net-mvc

在我的网络应用程序中,我将菜单放在局部视图上,然后从Site.Master加载它。

现在想象一个类似gmail的场景,在你的菜单上你会有一个收件箱(n)项目,其中n是未结束邮件的数量。是否有一种干净的方法将n变量传递给使用Site.Master主页的所有视图?

类似的东西:

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

4 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

只需在_ViewStart.cshtml中定义Global对象(查看根文件夹),并在项目中的所有视图中使用它们;)

答案 2 :(得分:0)

考虑将其保留在ViewData[]中。这就是您可以在不同(部分)视图之间轻松共享数据的方法。

控制器:

ViewData["UnreadMessages"] = "5";

所有视图都可以访问此属性。

答案 3 :(得分:0)

您应该能够像在示例中那样执行此操作,只需告诉它将值设为字符串,因为视图数据返回对象,只需将数字解包为字符串然后您可以使用它就像那样

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