0

マスター レイアウト ビュー (A) 内で定義された部分ビュー (厳密に型指定された) a1 があります。次に、それ自体がレイアウト ビューですが、マスター レイアウト ビュー内にネストされたサブ ビュー (B) があります。次に、呼び出されてモデル データが読み込まれるページ ビューがあります。このデータ内のデータをマスター レイアウト ビューにネストされた部分ビューまで渡すにはどうすればよいですか?

Shared/_Layout.cshtml (マスター レイアウト)

<!DOCTYPE html>
<html lang="en">
    <head>

    </head>
    <body>
        <header>
           @RenderPage("~/Views/Shared/PartialViews/Shared/_headerView.cshtml")
        </header>
    </body>
</html>

Shared/_Layout.cshtml (サブレイアウト)

@{
    ViewBag.Title = "Blog";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

@if (IsSectionDefined("BlogHeaderContent"))
{
    <div class="blogHeader">
        @RenderSection("BlogHeaderContent", required: false)
    </div>
}
    @RenderBody()

Views/Blogs/blogindex.cshtml (ブログ ビュー)

@model MyModels.Blog
@{
    ViewBag.Title = " See Blog";
}


@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Blog</legend>
        <div class="editor-label">
            @Html.LabelFor(model => model.Body)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Body)
            @Html.ValidationMessageFor(model => model.Body)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Title)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Title)
            @Html.ValidationMessageFor(model => model.Title)
        </div>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}
4

2 に答える 2

2

いくつかのオプション:

まず、ちょっとハックだと思いますが、ViewData/ViewBag のプロパティを設定できます。強く型付けされていないため、(私の意見では)ハッキーです。そこにどのオブジェクトが配置されるかわかりません。

次に、まだ少しハックですが、レイアウトとパーシャルに (強く?) 型付けされた Object のモデルを持たせることができます。探しているデータがあるかどうかを確認しようとします (リフレクションまたはインターフェイスを介して)。

第三に、それほどハックではありませんが、実際には制限があります。すべてのビューモデルが派生する必要があるインターフェイスを作成し、レイアウトとレイアウト部分がそれをモデルに使用できます。問題は、ビュー モデルが特定のインターフェイスから派生する必要があることを知らない他の開発者がアプリを爆破することです。

最後に、おそらく最良の解決策 (レイアウト部分が実行中のものを気にしないと仮定して)、ChildOnly属性を持つコントローラーを作成します ( ChildActionOnlyAttributeでマークされたメソッドは、 Action または RenderAction HTML 拡張メソッドでのみ呼び出すことができます. )。関心の分離を実装しているので、これは最高です。サブレイアウトはどのビューが実行されているかを気にせず、ビューはレイアウトで何が起こっているかについて何も知りません。

public class LayoutController
{
  [ChildOnly]
  public ActionResult SubLayout()
  {
    // Get Some Model Data
    var SubLayoutViewModel model = new SubLayoutViewModel();
    return this.View(model)
  }
}

Layout.cshtml

<!DOCTYPE html>
<html lang="en">
  <head>
  </head>
  <body>
    <header>
      @Html.RenderAction("Layout", "SubLayout")
    </header>
  </body>
</html>

SubLayout.cshtml

@model SubLayoutViewModel

@Model.SomeData.ToString() // or whatever

@if (IsSectionDefined("BlogHeaderContent"))
{
  <div class="blogHeader">
    @RenderSection("BlogHeaderContent", required: false)
  </div>
}

@RenderBody()
于 2013-06-07T03:12:11.427 に答える
1

厳密に型指定されたモデルから、ビューViewBagでタイトルが設定されているのと同様に、データを にコピーします。ViewBag

ViewBag.Title = "See Blog";

そこに他のデータを入れて、後でレイアウトや部分ビューでアクセスできます。

于 2013-06-07T02:50:57.533 に答える