将数据传递到布局页面

时间:2012-05-11 13:39:59

标签: asp.net .net asp.net-mvc-3 razor

我有一个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页面并为所有实例执行此操作?

7 个答案:

答案 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)

您可以使用ViewBagViewData将数据传递到布局页面。

<强>布局

<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>

希望这会有所帮助,但如果您从与已设置的默认页面不同的页面开始,它将无法工作。