.NET MVC - 可以不使用布局吗?

.NET MVC - Is it OK not to use layouts?

使用 .NET MVC 时,可以不使用任何布局视图,而只使用常规视图和局部视图吗?

我想这样做是因为我不喜欢 .NET MVC 在将数据推送到布局和非布局视图时的设计方式。

曾经可以将模型传递给“内容根视图”(即 Return View(myModel)),但在布局方面不能这样做。对于布局,强制使用 ViewBagViewData.

我喜欢拥有一个与我的“视图树”完美对应的“数据树”的想法,让每个视图从数据中选择自己的值,并将正确的节点传递给它的子视图包括他们的那一刻。我喜欢这样,因为它避免了在使用像 ViewBagViewData 这样的单个类似字典的集合时可能会遇到的键名冲突,因为视图树彼此不知道。

但是 .NET MVC 不允许将模型传递给布局这一事实迫使使用两种不同的方法来做同样的事情,即使用 ViewBagViewData 作为布局,以及“内容根视图”的“数据树”模型,这对我来说似乎不正确。

我希望有一个单一的入口点来将数据推送到我的视图,那应该是布局本身,而不是“内容根视图”。

因此基于此,我的想法是完全停止使用布局,取而代之的是有一个根视图用作布局,其中将包含一个局部视图树,这意味着我永远不会调用 @RenderBody(),而是调用 Html.Partial()

但是,这偏离了 .NET MVC 的应有使用方式,而且我根据经验知道,如果不按应有的方式使用技术,它可能会导致问题。所以这是我的困境,我不知道我是否应该按照我希望的方式对其进行编码并冒着在未来遇到问题的风险,或者只是按照我应该的方式使用 .NET MVC 和坚持使用这种将数据传递到我的视图的混合方式。

欢迎任何意见。谢谢!

我有兴趣查看您所面临问题的具体代码示例,如果您有的话?

继续你所说的,你怀疑你是被迫使用 ViewBag 是正确的,因为如果我们能帮助它,它并不是我们应该使用的东西。显然它在那里并且可以是一张很好的“免狱卡”,但坚持使用视图模型肯定更好。

您是否考虑过在 layout/view 中定义和使用部分?它们基本上像 RenderBody.

的命名版本一样工作

例如,在您的布局中,您可能有:

@RenderSection("SideBar", required: false)

这可以从您的视图访问,如下所示:

@model your.namespace.viewmodel    

... some view cshtml ...

@section SideBar {
    <h4>Related content for @Model.Name</h4>
    ...
}

查看此 overview of sections,它包含更深入的示例以及如何在您不想传递任何内容的情况下定义默认部分内容。