MVC 4主页_Layout传递数据

时间:2014-07-08 15:52:59

标签: c# asp.net-mvc asp.net-mvc-4 razor

我有一个名为_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();
        }
    }
}

3 个答案:

答案 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)
{
    ....
}