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()

视图/博客/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

几个选项:

首先,我觉得这有点 hacky,但您可以填充 ViewData/ViewBag 的属性。这很 hacky(在我看来),因为它不是强类型的,你不知道会放什么对象。

其次,仍然有点 hacky,你可以让你的布局和部分有一个(强烈?)类型的 Object 模型。他们尝试检查它是否具有您正在寻找的数据(通过反射或接口)。

第三,更少hacky但真正限制,您可以创建一个所有视图模型都必须从中派生的界面,然后您的布局和布局部分可以将其用于模型。问题变成了任何其他不知道您的视图模型需要从特定界面派生的开发人员都会炸毁应用程序。

最后,可能是最好的解决方案,(假设您的布局部分不关心正在执行的内容),创建一个具有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)
  }
}

布局.cshtml

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

子布局.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 回答