我想知道这里有人能否解释一下我最近关于Razor的一些问题.
1)基本上,我想将部分定义分成多个部分?为什么?因为我想过要.
遗憾地,使用@section"sectionname"两次抛出异常.
深入研究Razor源代码,我看到Razor检查了一个部分是否已经定义,并且如果已经定义了则抛出异常.
由于Razor使用委托来呈现部分,我将代码更改为使用Delegate.Combine(如果之前已经定义了部分),并且它工作正常,我现在能够创建一个声明两次(或更多)的部分.
2)当在视图中定义部分但未在布局页面中呈现时,将抛出异常.我没有看到一个优雅的解决方案来克服这一点.如果我想使用包含多个布局页面的View页面......这是一个问题.
查看源代码(再次),只有一个foreach检查视图中定义的每个部分是否已被渲染,然后如果尚未渲染部分则抛出异常.
我已经想到了一些解决方案(特别是对于我的第二个问题,继承自视图基类并将非呈现的部分暴露给布局页面并进行一些处理),但它们看起来有点像黑客.有没有更好的解决方案然后实际改变来源?
不是很重要,但是如果有人对设计决策有任何见解导致Razor成为这样的话,我也会感激,因为这似乎是一个非常严格的设计.
更新:
@davidferguson和@takepara你错了.我的问题不是在布局中定义一个部分,而是在视图中没有定义它,反之亦然.在视图中定义它但不在布局中定义它.
要在视图上未使用节时停止抛出异常,请使用必需参数.
@RenderSection("sectionname", required: false)
Run Code Online (Sandbox Code Playgroud)
使用此如果任何视图未实现此部分,则不会抛出任何异常.
1)不幸的是,这是产品早期的设计决策,因为将各个部分合并在一起以及按什么顺序存在很大的问题.并不是说我们不能这样做,但是在我们拥有它的时间范围内,不可能在所有场景中支持它作为一等公民.
2)这是一个有趣的想法.除了更改源代码之外,确实没有一个好的解决方案.但是,我已经为vNext的一个功能打开了一个问题,允许这种类型的场景.(没有承诺会削减它)
| 归档时间: |
|
| 查看次数: |
1716 次 |
| 最近记录: |