如果未在布局中呈现,则视图部分会导致问题

时间:2014-12-30 17:49:47

标签: asp.net asp.net-mvc asp.net-mvc-4 razor razorengine

我正在转换 MVC aspx 内容占有者 - >主页到 MVC剃须刀部分 - >布局。

过去我的aspx视图是这样的:

<asp:Content ID="HelpContent" ContentPlaceHolderID="HelpLink" runat="server">
    <a href="../../Support" target="HPhelp" title="Open GideonSoft Help">Help</a>
</asp:Content>

主页面没有相应的HelpContent占位符(可能是因为用户未经过身份验证)所有内容都很好(没有HelpContent部分)。

现在当我定义了一个剃刀部分,在布局中没有相应的@RenderSection时,我收到了这个错误:

  

以下部分已定义但尚未呈现   对于布局页面&#34;〜/ Views / Shared / New.cshtml&#34;:&#34; HelpLink&#34;。

我需要重新设计吗?

如果布局为绿灯指示,我是否可以选择渲染视图的HelpLink部分?

修改

我觉得有些混乱,所以让我重新总结一下:

布局逻辑如下所示:

if (User.IsLoggedIn) {
   @RenderSection( "HelpLinks", false);
}

然后用户没有登录,它没有渲染,然后.NET抛出异常,因为布局不知道如何处理该部分。

2 个答案:

答案 0 :(得分:1)

您可以通过传递false作为第二个参数来指示该部分是可选的:

  

@RenderSection(&#34; HelpLink&#34;,false);

编辑:对于渲染的控制流逻辑,您可以在剃刀视图中使用.NET(如此c#示例):

@if(IsSectionDefined("HelpLink"))
{
   @RenderSection("HelpLink", false);
}

或者,如果您想根据用户是否登录进行渲染,您可以使用安全检查替换上述示例中的if逻辑。

编辑2

确保您已定义该部分:

@section HelpLink {
   //This needs to be defined in any view that uses the layout with the @RenderSection.  It can be empty.
}

或者,您可以添加检查以查看该部分是否存在,并仅在所需视图中定义@section:

  

if(IsSectionDefined(&#34; HelpLink&#34;)&amp;&amp; User.IsLoggedIn){

     

@RenderSection(&#34; HelpLinks&#34;,false);

     

}

答案 1 :(得分:0)

如果在剃刀视图中声明了一个部分,则必须在布局中进行渲染。

我在Freeman的Pro ASP.NET MVC 5书中找到了这个。

对我来说似乎是一个糟糕的设计。