将数据传递到布局页面

Rup*_*ert 8 .net asp.net razor asp.net-mvc-3

我有一个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>
Run Code Online (Sandbox Code Playgroud)

我不想在每个人中填充这个ActionResult.有没有办法将数据传递到layout页面一次,并为所有实例执行此操作?

JBe*_*ton 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;
                }
            }
        }
    }


}
Run Code Online (Sandbox Code Playgroud)


Pra*_*nam 8

好了,因为您可以在使用局部视图后设置它.但是根据您的需要,您需要有几个部分视图(如果部分将分散在_layout页面中,可能并不理想)

你的局部视图看起来像

@model KarateAqua.schoolModel

<div class="bottom_logo">
<a href="/"><span class="inv">@Model.schoolName</span>
</div>
Run Code Online (Sandbox Code Playgroud)

调节器

public class SchoolController : Controller
{
     public ActionResult Index()
     {
          //get schoolModel  
          return PartialView(schoolModel);
     }
}
Run Code Online (Sandbox Code Playgroud)

在_layout.cshtml中,将此行放在要插入局部视图的位置

@Html.Action("Index","School")
Run Code Online (Sandbox Code Playgroud)


Joe*_*igh 5

您可以在布局页面上打开一个代码块并在那里填充对象。每次使用布局页面时都会执行此操作。好处是您不必更改控制器上的任何内容:

@{
    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>
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,仅当没有其他选项可用时才应使用视图中的代码块。你会让视图变得太智能。它是一个视图,它应该基于模式来呈现数据,该模式足以在没有代码块的情况下工作。 (2认同)