我有一些简单的< header>文件Shared / _Header.cshtml中的内容.
我的Shared / _Layout.cshtml通过调用插入该代码
@Html.Partial("_Header")
到目前为止,这工作正常.
现在,我有一些观点,除了通过@RenderBody()进行常规输出之外,还应该在标题的特定位置添加一些图标.
我在几个视图中使用@RenderSection()来创建侧边栏等.
现在,我的想法是在视图中创建一个部分(例如Home / Details.cshtml),然后向_Header添加RenderSection调用.布局将调用Header,而header将依次查看该节是否存在并调用它.
但是,这似乎不起作用.我收到以下错误/异常:
The file "~/Views/Shared/_Header.cshtml" cannot be requested directly because it calls the "RenderSection" method.
我的错误在哪里?我知道我可以在部分内“嵌套”部分调用.此代码可以很好地告诉布局用于边栏的文件:
@section Sidebar{
@Html.Partial("_SidebarDetails")
}
反过来行不通吗?
我需要一种在视图内部定义HTML块的方法,然后将其放入布局所调用的部分内部的预定义位置.
请帮助我了解如何执行此操作.
解决方法:
如果视图包含RenderSection,则将其视为布局页面,并且无法直接呈现.有关更多信息,请参见此问题:The file “~/Views/Position/Edit.cshtml” cannot be requested directly because it calls the “RenderSection” method
最简单的解决方案是将部分视图合并到布局中,特别是如果_Header.cshtml仅包含在布局页面中时.
另一种选择是在需要时使用自定义标头覆盖标头视图.
在布局页面中:
@if (IsSectionDefined("Header"))
{
RenderSection("Header");
}
else
{
@Html.Partial("_Header");
}
在您的视图中(带有自定义图标):
@section Header
{
@Html.Partial("_CustomHeader")
}
进一步的解决方案是从包含自定义图标数据(例如
public abstract class BaseModel
{
public List<Icon> Icons { get; set; }
}
public class ModelWithIcons : BaseModel
{
public ModelWithIcons()
{
// Set up icon data
}
}
_header部分视图(仍在布局页面中定义)将使用此基本模型,并进行空检查,呈现其找到的任何图标:
@model BaseModel
<!-- Header HTML -->
@if (Model != null && Model.Icon)
{
// Render icons
}
<!-- More HTML -->
显而易见的缺点是,所有模型都必须派生自BaseModel类,否则部分视图将引发错误.