我有一个名为_Layout.cshtml
的主页,并放在文件夹Views/Shared/_Layout.cshtml
中。
我创建了一个控制器:SharedController.cs
将数据传递给_Layout.cshtml
但不进入控制器。
如何将数据传递到每个加载母版页_Layout.cshtml
?
这是控制器,例如:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace HAnnoZero.Controllers
{
public class SharedController : Controller
{
public ActionResult _Layout()
{
ViewBag.help = "ciao";
return View();
}
}
}
答案 0 :(得分:4)
首先,不要将其称为母版页。这是来自Web Forms。在MVC中,_Layout.cshtml
是“布局”。这可能看起来像语义,但区分是很重要的,因为在Web窗体中,母版页本身就是一个真正的页面,它背后有自己的代码。在MVC中,布局只是一个带有一些占位符的HTML模板。控制器,特别是请求的控制器的操作,全权负责页面上下文。这也意味着您无法进行_Layout
操作,因为该操作未被调用,因此该操作未被调用,即使您这样做(通过在浏览器中转到/Shared/_Layout
之类的网址,将_Layout.cshtml
作为视图加载时会失败,因为它需要一个肤浅的视图来填充对@RenderBody()
的调用。
如果要在布局中使用自己的上下文渲染某些内容,则必须使用子操作:
<强>控制器强>
[ChildActionOnly]
public ActionResult Something()
{
// retrieve a model, either by instantiating a class, querying a database, etc.
return PartialView(model);
}
<强> Something.cshtml 强>
@model Namespace.To.ModelClass
<!-- HTML that utilizes data from the model -->
<强> _Layout.cshtml 强>
@Html.Action("Something", "ControllerSomethingActionIsIn")
答案 1 :(得分:1)
另一种方法是创建一个其他控制器继承的公共基本控制器:
public abstract class BaseController : Controller
{
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.Controller.ViewBag.Title = "Hello world";
}
}
public class SharedController : BaseController
{
...
}
然后在_layout中你只需使用:
<title>@ViewBag.Title</title>
答案 2 :(得分:0)
布局页面不能以这种方式工作。在使用默认MVC项目时,您的操作返回的视图将在_Layout
页面内呈现。
有关_Layout
页面的更多介绍,请参阅here。
在_Layout
页面中显示信息的一种方法是使用从_Layout
页面调用的child action方法。
例如,_Layout.cshtml可能包含类似于:
的调用@Html.Action("GetNews", "Home", new { category = "Sports"})
然后你会有一个类似于:
的控制器动作[ChildActionOnly]
public ActionResult GetNews(string category)
{
....
}