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"方法.
这有什么不对?
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)
可以使用剃刀助手来解决这个问题。它有点优雅 - 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)