c#-asp.net mvs部分/部分中的部分?

我有一些简单的< 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类,否则部分视图将引发错误.

上一篇:c#-在MVC4中的DropDownListFor()上未设置所选值


下一篇:在C#中将NULL局部变量用于List