我有一个layout
页面,其中包含需要填充的变量。示例:
@ModelType KarateAqua.schoolModel
<html>
<body>
@RenderBody()
<div id="footer">
<div class="content">
<div class="bottom_logo">
<a href="/"><span class="inv">@Model.schoolName</span></a>
</div>
</div>
</div>
</body>
</html>
我不想在每个ActionResult
填充此内容。有没有办法将数据传递到layout
页面并为所有实例执行此操作?
答案 0 :(得分:14)
创建一个动作过滤器并装饰您的控制器类。在操作过滤器内部,您可以访问viewbag中可用于布局的值。
这将在每个请求上运行,您不必在每个操作中设置值。您可以查找并忽略子请求和ajax请求之类的内容,这些请求通常不会使用布局,也不会为这些请求设置viewbag值。
下面是我创建的一个属性示例,用于从会话中复制对象并通过ViewBag将其提供给布局
public class CurrentUserAttribute : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
// Don't bother running this for child action or ajax requests
if (!filterContext.IsChildAction && !filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
{
if (filterContext.HttpContext.Session != null)
{
var currentUser = filterContext.HttpContext.Session["CurrentUser"] as CurrentUser;
if (currentUser != null)
{
filterContext.Controller.ViewBag.CurrentUser = currentUser;
}
}
}
}
}
答案 1 :(得分:7)
好的,因为您可以在使用局部视图后设置它。但是,根据您的需要,您需要有几个部分视图(如果部分将分散在_layout页面中,可能并不理想)
你的局部视图看起来像
@model KarateAqua.schoolModel
<div class="bottom_logo">
<a href="/"><span class="inv">@Model.schoolName</span>
</div>
控制器
public class SchoolController : Controller
{
public ActionResult Index()
{
//get schoolModel
return PartialView(schoolModel);
}
}
在_layout.cshtml中,将此行放在要插入部分视图的位置
@Html.Action("Index","School")
答案 2 :(得分:4)
您可以在布局页面上打开代码块并在那里填充对象。这将在每次使用布局页面时执行。好处是您不必更改控制器上的任何内容:
@{
KarateAqua.schoolModel data = YourBusinessLayer.Method();
}
<html>
<body>
@RenderBody()
<div id="footer">
<div class="content">
<div class="bottom_logo">
<a href="/"><span class="inv">@data.schoolName</span></a>
</div>
</div>
</div>
</body>
</html>
答案 3 :(得分:2)
您可以使用ViewBag
或ViewData
将数据传递到布局页面。
<强>布局强>
<html>
<body>
@RenderBody()
<div id="footer">
<div class="content">
<div class="bottom_logo">
<a href="/"><span class="inv">@ViewBag.schoolName</span>
</div></div></div>
</body>
</html>
<强>控制器强>
public ActionResult Index(){
ViewBag.schoolName = "Bayside Tigers";
return View();
}
答案 4 :(得分:1)
您始终可以创建返回标题部分视图的操作。
只需将其添加到您的layout
页面:
<html>
<head>
</head>
<body>
@{ Html.RenderAction("header", "MyController", new { area = "" }); }
@RenderBody()
//...
答案 5 :(得分:1)
您的布局页面
@ViewBag.LayoutVar
您的HomeController:
public class HomeController : BaseController
{
//Here some logic...
}
您的BaseController
namespace ProjectName.Controllers
{
public class BaseController : Controller
{
public YetkiController()
{
//This parameter is accessible from layout
ViewBag.LayoutVar = "Suat";
}
}
}
逻辑很简单:您创建BaseController,其中包含您将在布局中使用的每个全局参数。 (与用户名或其他基于数据的参数一样)
您继承(调用)BaseController
以将所有参数输入当前控制器。
答案 6 :(得分:1)
我使用HTTP Session
在不同页面之间保存数据 -
//Opening page controller
public ActionResult Index()
{
Session["something"]="xxxx";
return View();
}
在共享的_layout
页面中
//persistent data
<p>Hello, @Session["something"]!</p>
希望这会有所帮助,但如果您从与已设置的默认页面不同的页面开始,它将无法工作。