【问题标题】:view sections cause problems if not rendered in layout如果不在布局中呈现,视图部分会导致问题
【发布时间】:2015-02-26 21:26:09
【问题描述】:

我正在将 MVC aspx 内容占位符 -> 母版页转换为 MVC razor 部分 -> 布局。

过去当我的 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 的剃须刀部分时,我收到此错误:

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

我需要重新设计吗?

如果布局给了它绿灯,我有没有办法让视图的 HelpLink 部分呈现可选?

编辑:

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

布局逻辑如下:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    @RenderSection("HelpLink", false);

    编辑:在用于渲染的控制流逻辑的情况下,您可以在 razor 视图中使用 .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("HelpLink") && User.IsLoggedIn) {

    @RenderSection("帮助链接", false);

    }

    【讨论】:

    • 谢谢,但问题是视图指定了它,但布局没有调用它(因为用户缺乏凭据)。除非有办法在视图中将其设置为可选?
    • 响应您更新的答案:如果身份验证逻辑确定不呈现它,那么我会收到异常,因为有一个部分未呈现。希望这是有道理的。
    【解决方案2】:

    如果在 razor 视图中声明了一个部分,则它必须在布局中呈现。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2012-11-25
      • 2016-06-22
      • 1970-01-01
      • 2014-08-18
      相关资源
      最近更新 更多