11

我有一个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一次将数据传递到页面并为所有实例执行此操作?

4

7 回答 7

15

创建一个动作过滤器并装饰您的控制器类。在动作过滤器中,您可以将值放入视图包中,这些值可用于您的布局。

这将在每个请求上运行,您不必在每个操作中设置值。您可以查找并忽略诸如子请求和 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;
                }
            }
        }
    }


}
于 2012-09-05T19:48:52.970 回答
9

好的,因为您希望在可以使用局部视图时设置它。但是,根据您的需要,您将需要有几个部分视图(如果部分将分散在 _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")
于 2012-05-11T13:58:38.870 回答
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>
于 2015-01-29T21:00:28.263 回答
1

您可以使用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();
}
于 2012-05-11T13:46:09.283 回答
1

您始终可以创建返回标题的部分视图的操作。

只需将其添加到您的layout页面:

<html>
    <head> 
    </head>
        <body>
            @{ Html.RenderAction("header", "MyController", new { area = "" }); }

            @RenderBody()
//...
于 2015-02-04T05:57:55.103 回答
1

我曾经HTTP Session在不同页面之间保留数据 -

//Opening page controller
public ActionResult Index()
{    
    Session["something"]="xxxx";
    return View();
}

在共享_layout页面中;

//persistent data   
<p>Hello, @Session["something"]!</p>

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

于 2016-05-17T15:55:03.017 回答
1

您的布局页面:

@ViewBag.LayoutVar

你的家庭控制器:

public class HomeController : BaseController
{
   //Here some logic...
}

你的基础控制器

namespace ProjectName.Controllers
{
    public class BaseController : Controller
    {

        public YetkiController()
        {
            //This parameter is accessible from layout
            ViewBag.LayoutVar = "Suat";
        }
    }
}

逻辑很简单:您创建 BaseController ,其中包含您将在布局中使用的每个全局参数。(如用户名或其他基于数据的参数)

您继承(调用)BaseController以将所有参数放入当前控制器。

于 2016-02-08T12:33:06.640 回答