我有一些简单的<header>
Shared/_Header.cshtml 文件中的内容。
My Shared/_Layout.cshtml 通过调用插入该代码
@Html.Partial("_Header")
目前为止一切正常。
现在我有一些看法,除了通过@RenderBody()
的正常输出之外, 还应该在标题的特定位置添加一些图标。
我使用 @RenderSection()
在我的一些观点中,创建侧边栏等。
现在我的想法是在我的 View 中创建一个部分(例如 Home/Details.cshtml)并添加一个 RenderSection
调用 _Header。 Layout 会调用 Header,然后 header 会查看该部分是否存在并调用它。
但是这似乎不起作用。我收到以下错误/异常:
The file "~/Views/Shared/_Header.cshtml" cannot be requested directly because it calls the "RenderSection" method.
我的错误在哪里?我知道我可以在一个部分中“嵌套”一个部分调用就好了。这段代码可以很好地告诉布局将哪个文件用于侧边栏:
@section Sidebar{
@Html.Partial("_SidebarDetails")
}
反过来不行吗?
我需要在 View 中定义一个 HTML block ,然后将其放入由布局调用的部分内的预定义位置。
请帮助我了解如何执行此操作。
最佳答案
如果一个 View 包含一个RenderSection
,它被认为是一个布局页面,不能直接渲染。有关详细信息,请参阅此问题:The file "~/Views/Position/Edit.cshtml" cannot be requested directly because it calls the "RenderSection" method
最简单的解决方案是将局部 View 合并到布局中,特别是如果 _Header.cshtml 仅包含在布局页面中。
另一种选择是在需要时使用自定义标题覆盖标题 View 。
在您的布局页面中:
@if (IsSectionDefined("Header"))
{
RenderSection("Header");
}
else
{
@Html.Partial("_Header");
}
在您的 View 中(使用自定义图标):
@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 部分 View (仍在布局页面中定义)将使用此基本模型,并通过空检查呈现它找到的任何图标:
@model BaseModel
<!-- Header HTML -->
@if (Model != null && Model.Icon)
{
// Render icons
}
<!-- More HTML -->
这里明显的缺点是您的所有模型都必须派生自 BaseModel 类,否则局部 View 会抛出错误。
关于c# - 部分/部分中的 asp.net mvs 部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22230882/