我在主版面视图(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")
}
答案 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";
您可以在其中放入其他数据,然后在布局和部分视图中访问它。