RenderSection()内部部分与母版页

时间:2011-01-30 18:12:52

标签: c# asp.net-mvc razor

我在母版页(布局)中添加了部分“补充工具栏”,在我正在使用的部分内部:

@RenderSection("SearchList", required: false)

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

@section SearchList {
    // bunch of html
}

但它给了我错误:

  

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

这里有什么问题?

4 个答案:

答案 0 :(得分:23)

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

答案 1 :(得分:15)

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

您可能还需要渲染需要放入其中一个局部视图的标记中的节。但是,由于部分视图不支持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
}

答案 2 :(得分:4)

可以用剃刀助手来解决这个问题。它有点优雅 - 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>

答案 3 :(得分:0)

虽然Bosken85的答案很接近,但是在您的视图中未定义该节时,它的效果并不理想。不使用if语句((首先引发异常。)您需要重载包含3个参数的RenderPartial,以便不忽略不存在的RenderSection,从而导致将错误的模型传递给局部布局。 / p>

在_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}