【问题标题】:global variable in asp-net mvc viewsasp-net mvc 视图中的全局变量
【发布时间】:2011-02-22 18:07:53
【问题描述】:

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

现在想象一个类似 gmail 的场景,在您的菜单上,您将有一个 Inbox(n) 项,其中 n 是未读邮件的数量。是否有一种干净的方法可以将 n 变量传递给使用 Site.Master 母版页的所有视图?

类似:

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

【问题讨论】:

标签: asp.net-mvc


【解决方案1】:

您可以将子操作与 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>

【讨论】:

  • 这很好用。不知道 RenderAction,只知道 RenderPartial。感谢您的帮助。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    控制器:

    ViewData["UnreadMessages"] = "5";
    

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

    【讨论】:

    • 这个问题是我必须在我的所有操作上设置 ViewData["UnreadMessages"]。我正在寻找一种更清洁的方法。
    【解决方案4】:

    您应该能够按照示例中的方式进行操作,只需告诉它将值设为字符串,因为视图数据返回对象,只需将数字拆箱为字符串,然后您就可以像这样使用它

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

    【讨论】:

    • 这个问题是我必须在我的所有操作上设置 ViewData["UnreadMessages"]。我正在寻找一种更清洁的方法
    猜你喜欢
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    相关资源
    最近更新 更多