RenderSection()内部部分与母版页

rak*_*los 29 c# asp.net-mvc razor

我有一个部分"边栏"添加到母版页(布局)和我正在使用的部分内部:

@RenderSection("SearchList", required: false)
Run Code Online (Sandbox Code Playgroud)

在其中一个使用我正在做的母版页的视图中:

@section SearchList {
    // bunch of html
}
Run Code Online (Sandbox Code Playgroud)

但它给了我错误:

无法直接请求文件"〜/ Views/Shared/_SideBar.cshtml",因为它调用"IsSectionDefined"方法.

这有什么不对?

mar*_*ind 23

Razor目前不支持您尝试做的事情.节仅在视图页面及其直接布局页面之间起作用.


Bos*_*n85 15

在创建布局视图时,您可能希望将某些部分分别放入部分视图中.

您可能还需要渲染需要放入其中一个局部视图的标记中的节.但是,由于部分视图不支持RenderSection逻辑,因此您必须解决此问题.

通过将"布局"页面中的RenderSection结果作为局部视图的模型传递,可以在局部视图中渲染节.您可以通过在_Layout.cshtml中放置这行代码来完成此操作.

_Layout.cshtml

@{ Html.RenderPartial("_YourPartial", RenderSection("ContextMenu", false));}
Run Code Online (Sandbox Code Playgroud)

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

_YourPartial.cshtml

@model HelperResult
@if (Model != null)
{
    @Model
}
Run Code Online (Sandbox Code Playgroud)


mdo*_*tas 5

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

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

@helper HtmlYouWantRenderedInAPartialView()
{
    <blink>Attention!</blink>
}
Run Code Online (Sandbox Code Playgroud)

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

@Html.Partial("somePartial", new ViewDataDictionary { { "OptionalSection1", (Func<HelperResult>)(HtmlYouWantRenderedInAPartialView) } })
Run Code Online (Sandbox Code Playgroud)

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

<div>@ViewData.RenderHelper("OptionalSection1")</div>
Run Code Online (Sandbox Code Playgroud)

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

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;
}
Run Code Online (Sandbox Code Playgroud)

所以重点是传递这个助手的委托,然后当子视图调用它时,内容会被渲染到你想要的地方。

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

<div><blink>Attention!</blink></div>
Run Code Online (Sandbox Code Playgroud)