Razor partials是否可能相互沟通/影响或布局?他们是否有可能影响外面的标记 - 特别是“上面” - 他们自己?
我喜欢Webforms中的控件之一是它们可以与母版页或彼此“通信”。
例如,如果用户控件需要一些特殊的CSS,您可以执行以下操作:
Page.Head.Controls.Add(new LiteralControl("<style>[something here]</style>"));
这会将STYLE块注入页面的HEAD标记。因此,用户控制可以在“外部”本身和 - 在这种情况下 - 在“上方”本身进行通话。即使用户控件位于页面底部,它也可以“到达”页面并影响其他控件和标记。
现在,有了MVC,说我有部分。部分需要自定义CSS。它如何与布局模板对话告诉它将CSS放入HEAD标签?另外,假设这个局部使用了两次 - 你如何确保它只执行一次?
我有一个HeadTagContent部分(应用程序在Webforms中时的一个退化的ContentPlaceHolder),但是即使我在部分中使用它,当部分渲染我们在“部分下面”时,所以它不会做任何事。
我有一个ViewModel类。我可以为“CustomCss”创建一个属性,并从partial中设置/追加它(是的,这可能是不好的形式......),然后将它从布局中写入HEAD标签。然而,再次,当我的部分执行此操作时,布局已经呈现,这意味着我们“低于”HEAD标记。
在哲学上,我在这里不理解什么?虽然我的CSS问题是我的急性问题,但我正试图找到更大的点/架构。
答案 0 :(得分:1)
在剃须刀中,相当于您正在寻找的内容称为sections&lt; - 好指南。
在_Layout.cshtml
文件中,您输入的代码如下:
@RenderSection("Scripts", false) // true = section required
//false = section optional
和
@RenderBody()
然后在你的观点中你输入这样的代码
@section Scripts
{
<!--
razor and html markup placed here gets rendered in the "Scripts"
section in _Layout.cshtml
-->
}
<!-- code here goes in RenderBody()-->
答案 1 :(得分:0)
WebForms和MVC Views之间的主要区别在于WebForms创建了一个对象树,由各种控件和其他部分组成。创建此树后,将通过递归请求控件自行呈现来呈现页面。因为这种情况发生得很晚,所以您可以参考插入控件之前的页面部分,因为页面尚未呈现。
另一方面,MVC Razor Views一次性执行。 ViewEngine被实例化,接收视图,viewdata和(可能)模型,并从上到下开始执行代码(或输出HTML)。甚至不需要将布局和渲染部分加载到其中,但完全是可选的。由于该过程是单次传递,从上到下,您不能进行反向引用,因为该部分已经完成,甚至可能已经发送到浏览器。