在ASP.NET MVC中,使用@RenderSection有什么好处(比如说@RenderPage)?

时间:2011-08-04 10:21:56

标签: asp.net-mvc

如果我做错了什么,我想要开悟。我打赌我是。

如果我在视图页面中有以下代码:

@{
    ViewBag.Title = "About Us";
}

<h2>About</h2>
<p>
    sample content.
</p>
@section header
{
    <div id="header">
        Chapter 3a: Creating a Consistent Look
    </div>
}

...我应该在我的布局页面中使用ff来渲染部分(如果可用)以防止在运行时发生异常:

@if (IsSectionDefined("header"))
{ 
    @RenderSection("header")
}

但是,如果我在渲染该部分之前没有检查该部分的最后4行(例如,我对它们进行了全部注释),编译器将不会检查我的视图页面中是否定义了部分,并允许我构建和运行应用程序。在运行期间,只有在运行页面时才会出现此错误:

  

以下部分已定义但尚未呈现   对于布局页面“〜/ Views / Shared / _Layout2.cshtml”:“header”。

我的问题是ff:

  1. 我们如何防止这种情况发生?是否存在强制编译器检查缺少的@RenderSection代码的设置?
  2. 使用@section功能是否会降低系统的可维护性(假设问题#1没有正面答案),因为我们需要在整个过程中手动搜索@section关键字的存在整个申请?
  3. 在这种情况下,使用@RenderSection而不是@RenderPage的优势是什么?
  4. 我们还能使@section有条件吗?

2 个答案:

答案 0 :(得分:2)

我从未想过这是一个问题。这个概念与aspx语法中的占位符相同,因此如果您的主页中有2个占位符,那么您应该在每个页面/视图中使用该主页包含2个内容。

菲尔·哈克(Phil Haack)有一篇关于这个论点的博客文章,它没有直接解决你的问题,但肯定是值得考虑的事情。

http://haacked.com/archive/2011/03/05/defining-default-content-for-a-razor-layout-section.aspx

答案 1 :(得分:2)

我知道它已经老了但如果有人经过这个。

@RenderSection(“header”,required:false)你可以拥有一个 是否在您的视图页面中显示@section header {}。

现在您还可以从布局中删除检查条件。 这也是有条件的!

如果您需要它,您可以: @RenderSection(“header”,required:true)但如果您的视图没有@section标题,则会抛出错误。