如何与布局视图和布局中的部分共享(建模)数据?

时间:2013-06-07 00:23:54

标签: asp.net-mvc razor

我在主版面视图(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(SubLayout)

@{
    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")
}

2 个答案:

答案 0 :(得分:2)

几个选项:

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

其次,仍然有点hacky,你可以有你的布局,并且部分有一个(强烈?)类型的Object模型。他们试图检查并查看它是否包含您要查找的数据(通过反射或界面)。

第三,不那么hacky但真正限制,你可以创建一个所有视图模型必须派生的界面,然后你的Layout和Layout Partial可以将它用于Model。问题变成任何其他开发人员,他们不知道您的视图模型需要从特定界面派生,这会破坏应用程序。

最后,可能是最好的解决方案,(假设你的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()

答案 1 :(得分:1)

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

ViewBag.Title = "See Blog";

您可以在其中放入其他数据,然后在布局和部分视图中访问它。