【问题标题】:How do I share (model) data with the layout view and partials in the layout?如何与布局视图和布局中的部分共享(模型)数据?
【发布时间】:2013-06-07 00:23:54
【问题描述】:

我在我的主布局视图 (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")
}

【问题讨论】:

  • 你应该发布示例代码。
  • 为什么你的主布局和子布局是同一个文件(Shared/_Layout.cshtml)?
  • 拥有 all 代码或修复您在 ?因为它看起来像 3 个完全不相关的视图。

标签: asp.net-mvc razor


【解决方案1】:

几个选项:

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

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

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

最后,可能是最好的解决方案,(假设您的布局部分不关心正在执行的内容),创建一个具有ChildOnly 属性的控制器(任何标有 ChildActionOnlyAttribute 的方法只能被调用使用 Action 或 RenderAction HTML 扩展方法。)。这是最好的,因为它实现了Separation of concerns。 Sublayout 不关心正在执行什么视图,并且视图对布局中发生的事情一无所知。

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

【讨论】:

    【解决方案2】:

    将数据从您的强类型模型复制到ViewBag,类似于您在视图中在ViewBag 中设置标题的方式:

    ViewBag.Title = "See Blog";
    

    您可以将其他数据放在那里,然后在您的布局和局部视图中访问它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-06
      • 1970-01-01
      • 1970-01-01
      • 2020-02-24
      相关资源
      最近更新 更多