我有一个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
网页一劳永逸的情况下做到这一点?
Answer 1:
OK,因为你想要这个设置一次,你可以使用一个局部视图。 但是根据你的需要,你需要有一些局部视图(可能是不理想的,如果部分将要分散在_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")
Answer 2:
创建一个动作过滤器和装饰你的控制器类。 里面的动作过滤器可以访问把值在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;
}
}
}
}
}
Answer 3:
您可以打开页面布局上以代码块和填充对象那里。 这将执行每一个正在使用的页面布局的时间。 好处是,你不必改变你的控制器上的任何内容:
@{
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>
Answer 4:
你可以使用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();
}
Answer 5:
布局页:
@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
让所有参数到当前的控制器。
Answer 6:
你总是可以创建一个返回你的头的局部视图动作。
只需添加到您的layout
页:
<html>
<head>
</head>
<body>
@{ Html.RenderAction("header", "MyController", new { area = "" }); }
@RenderBody()
//...
Answer 7:
我用HTTP Session
坚持不同页面之间的数据-
//Opening page controller
public ActionResult Index()
{
Session["something"]="xxxx";
return View();
}
在共享_layout
页;
//persistent data
<p>Hello, @Session["something"]!</p>
希望这可以帮助,但如果你从不同的页面从已设置的默认之一启动将无法正常工作。
文章来源: Passing Data to a Layout Page