将数据传递到布局页(Passing Data to a Layout Page)

2019-06-24 08:38发布

我有一个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网页一劳永逸的情况下做到这一点?

Answer 1:

OK,因为你想要这个设置一次,你可以使用一个局部视图。 但是根据你的需要,你需要有一些局部视图(可能是不理想的,如果部分将要分散在_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")


Answer 2:

创建一个动作过滤器和装饰你的控制器类。 里面的动作过滤器可以访问把值在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;
                }
            }
        }
    }


}


Answer 3:

您可以打开页面布局上以代码块和填充对象那里。 这将执行每一个正在使用的页面布局的时间。 好处是,你不必改变你的控制器上的任何内容:

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


Answer 4:

你可以使用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();
}


Answer 5:

布局页:

@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让所有参数到当前的控制器。



Answer 6:

你总是可以创建一个返回你的头的局部视图动作。

只需添加到您的layout页:

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

            @RenderBody()
//...


Answer 7:

我用HTTP Session坚持不同页面之间的数据-

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

在共享_layout页;

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

希望这可以帮助,但如果你从不同的页面从已设置的默认之一启动将无法正常工作。



文章来源: Passing Data to a Layout Page