在我的网络应用程序中,我将菜单放在局部视图上,然后从Site.Master加载它。
现在想象一个类似gmail的场景,在你的菜单上你会有一个收件箱(n)项目,其中n是未结束邮件的数量。是否有一种干净的方法将n变量传递给使用Site.Master主页的所有视图?
类似的东西:
<%: Html.ActionLink("Inbox - " + ViewData["n"], "Index", "Home") %>
答案 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") %>