【问题标题】:RenderSection() inside partial with master page带有母版页的部分内部的 RenderSection()
【发布时间】:2020-08-05 08:53:22
【问题描述】:

我在母版页(布局)中添加了一个部分“侧边栏”,并且在这个部分中我正在使用:

@RenderSection("SearchList", required: false)

在使用我正在做的母版页的视图之一上:

@section SearchList {
    // bunch of html
}

但它给了我错误:

无法直接请求文件“~/Views/Shared/_SideBar.cshtml”,因为它调用了“IsSectionDefined”方法。

这里有什么问题?

【问题讨论】:

    标签: c# asp.net-mvc razor


    【解决方案1】:

    Razor 目前不支持您尝试执行的操作。部分仅在视图页面及其直接布局页面之间起作用。

    【讨论】:

    • 任何解决方法?我有一个布局->页面->部分。当部分存在时,我需要在头部引用和加载脚本/布局。任何非愚蠢的方式来做到这一点?这个限制有什么意义呢?
    • @Shimmy 您可以尝试将某种数据结构放入 ViewData 中,以指定布局页面应引用哪些内容。
    • 谢谢。我现在正在阅读有关Cassette 的信息,这看起来是一个不错的解决方案。谢谢。
    【解决方案2】:

    创建布局视图时,您可能希望将一些部分单独放入部分视图中。

    您可能还需要渲染需要放置到这些部分视图之一的标记中的部分。但是,由于局部视图不支持 RenderSection 逻辑,因此您必须解决此问题。

    您可以通过将布局页面中的 RenderSection 结果作为局部视图的模型来呈现局部视图中的部分。您可以通过将这行代码放在您的_Layout.cshtml 中来做到这一点。

    _Layout.cshtml

    @{ Html.RenderPartial("_YourPartial", RenderSection("ContextMenu", false));}
    

    然后在 _YourPartial.cshtml 中,您可以在 _Layout 视图的 Html.RenderPartial 调用中呈现作为模型传递的部分。您检查模型是否为空,以防您的部分不需要。

    _YourPartial.cshtml

    @model HelperResult
    @if (Model != null)
    {
        @Model
    }
    

    【讨论】:

    • 什么?很有趣,但你应该进一步解释一下,因为这有点像 hack。
    • 是的。谢谢。仍然有点hacky,但我猜它的工作。赞成。
    • 如果没有定义该部分,这将不起作用 - 页面的模型被传递到部分,并抛出异常:“传递到字典中的模型项的类型为 'xx. yyModel”,但此字典需要“System.Web.WebPages.HelperResult”类型的模型项。
    【解决方案3】:

    可以使用剃须刀助手解决此问题。它有点优雅-hacky™,但它为我完成了这项工作。

    所以在父视图中定义一个助手:

    @helper HtmlYouWantRenderedInAPartialView()
    {
        <blink>Attention!</blink>
    }
    

    然后当你渲染部分时,你将这个助手传递给它

    @Html.Partial("somePartial", new ViewDataDictionary { { "OptionalSection1", (Func<HelperResult>)(HtmlYouWantRenderedInAPartialView) } })
    

    然后在局部视图中,您可以像这样调用这个助手

    <div>@ViewData.RenderHelper("OptionalSection1")</div>
    

    最后你需要有这个扩展方法来简化“调用”部分

    public static HelperResult RenderHelper(this ViewDataDictionary<dynamic> viewDataDictionary, string helperName)
    {
        Func<HelperResult> helper = viewDataDictionary[helperName] as Func<HelperResult>;
        if (helper != null)
        {
            return helper();
        }
    
        return null;
    }
    

    所以重点是传递这个助手的委托,然后当子视图调用它时,内容会呈现在您想要的位置。

    子视图的最终结果如下所示

    <div><blink>Attention!</blink></div>
    

    【讨论】:

      【解决方案4】:

      虽然 Bosken85 的答案很接近,但当您的视图中未定义该部分时,它就不太适用了。不使用 if 语句,(首先抛出异常。)您需要重载包含 3 个参数的 RenderPartial,以便不忽略不存在的 RenderSection,导致将错误的模型传递给部分布局。

      在 _Layout.cshtml(你的整体布局)中你使用:

      @{Html.RenderPartial("_Partial", RenderSection("sectionNameGoesHere", false), new ViewDataDictionary());}
      

      在 _Partial.cshtml(您想要定义 RenderSection 的部分布局)中使用:

      @model HelperResult
      @Model
      

      在 Index.cshtml(使用 _Layout.cshtml 进行布局的布局,并且您希望将一些内容放入部分布局的部分)中,您可以使用:

      @section sectionNameGoesHere{stuff you want in the section goes here}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-01
        • 2014-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-13
        相关资源
        最近更新 更多