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>

これをすべてに入力したくありませんActionResultlayoutデータをページに一度渡して、すべてのインスタンスに対してそれを行う方法はありますか?

4

7 に答える 7

15

アクションフィルターを作成し、コントローラークラスを装飾します。アクションフィルター内では、レイアウトで使用できる値をビューバッグに配置するためのアクセス権があります。

これはリクエストごとに実行され、各アクションで値を設定する必要はありません。子リクエストやajaxリクエストなど、通常はレイアウトを使用せず、それらのビューバッグ値を設定しないものを探して無視することができます。

以下は、セッションからオブジェクトをコピーし、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

部分ビューを利用できるようになったら、これを設定する必要があるので、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")
于 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

ViewBagまたはを使用ViewDataして、レイアウトページにデータを渡すことができます。

レイアウト

<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

レイアウトページ:

@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して、すべてのパラメーターを現在のコントローラーに取り込みます。

于 2016-02-08T12:33:06.640 に答える
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 に答える