剃刀部分怪癖

时间:2011-03-05 21:31:46

标签: asp.net-mvc razor

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

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

遗憾地,使用@section“sectionname”两次抛出异常。

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

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

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

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

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

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

更新

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

3 个答案:

答案 0 :(得分:5)

要在视图上未使用某个部分时停止抛出异常,请使用所需的参数。

@RenderSection("sectionname", required: false)

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:1)

Defining Default Content For A Razor Layout Section

这是一个非常好的条目。