剃刀部分怪癖

Lin*_*ron 3 asp.net-mvc razor

我想知道这里有人能否解释一下我最近关于Razor的一些问题.

1)基本上,我想将部分定义分成多个部分?为什么?因为我想过要.

遗憾地,使用@section"sectionname"两次抛出异常.

深入研究Razor源代码,我看到Razor检查了一个部分是否已经定义,并且如果已经定义了则抛出异常.

由于Razor使用委托来呈现部分,我将代码更改为使用Delegate.Combine(如果之前已经定义了部分),并且它工作正常,我现在能够创建一个声明两次(或更多)的部分.

2)当在视图中定义部分但未在布局页面中呈现时,将抛出异常.我没有看到一个优雅的解决方案来克服这一点.如果我想使用包含多个布局页面的View页面......这是一个问题.

查看源代码(再次),只有一个foreach检查视图中定义的每个部分是否已被渲染,然后如果尚未渲染部分则抛出异常.

我已经想到了一些解决方案(特别是对于我的第二个问题,继承自视图基类并将非呈现的部分暴露给布局页面并进行一些处理),但它们看起来有点像黑客.有没有更好的解决方案然后实际改变来源?

不是很重要,但是如果有人对设计决策有任何见解导致Razor成为这样的话,我也会感激,因为这似乎是一个非常严格的设计.

更新:

@davidferguson和@takepara你错了.我的问题不是在布局中定义一个部分,而是在视图中没有定义它,反之亦然.在视图中定义它但不在布局中定义它.

dav*_*son 5

要在视图上未使用节时停止抛出异常,请使用必需参数.

@RenderSection("sectionname", required: false)
Run Code Online (Sandbox Code Playgroud)

使用此如果任何视图未实现此部分,则不会抛出任何异常.


Mat*_*orn 5

1)不幸的是,这是产品早期的设计决策,因为将各个部分合并在一起以及按什么顺序存在很大的问题.并不是说我们不能这样做,但是在我们拥有它的时间范围内,不可能在所有场景中支持它作为一等公民.

2)这是一个有趣的想法.除了更改源代码之外,确实没有一个好的解决方案.但是,我已经为vNext的一个功能打开了一个问题,允许这种类型的场景.(没有承诺会削减它)