asp.net mvs部分/部分内的部分?

时间:2014-03-06 16:51:49

标签: c# asp.net asp.net-mvc razor partial-views

我在Shared / _Header.cshtml文件中有一些简单的<header>内容。

我的Shared / _Layout.cshtml通过调用

来插入该代码
@Html.Partial("_Header")

到目前为止,此工作正常。

现在我有一些观点,除了通过@RenderBody()的正常输出外,还应该在标题的特定位置添加一些图标。

我在几个视图中使用@RenderSection()来创建侧边栏等等。

现在我的想法是在我的视图中创建一个部分(例如Home / Details.cshtml)并向_Header添加RenderSection调用。布局将调用标题,然后标题将查看该部分是否存在并调用它。

然而,这似乎不起作用。我收到以下错误/异常:

The file "~/Views/Shared/_Header.cshtml" cannot be requested directly because it calls the "RenderSection" method.

我的错误在哪里?我知道我可以在一个部分中“嵌套”部分调用就好了。这段代码可以很好地告诉布局用于侧边栏的文件:

@section Sidebar{
    @Html.Partial("_SidebarDetails")
}

它不相反吗?

我需要在视图中定义一个HTML块,然后将其放入布局调用的局部内部的预定义位置。

请帮助我了解如何执行此操作。

1 个答案:

答案 0 :(得分:3)

如果视图包含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部分视图(仍然在布局页面中定义)将使用此基本模型,并使用null检查,呈现它找到的任何图标:

@model BaseModel

<!-- Header HTML -->
@if (Model != null && Model.Icon)
{
    // Render icons
}
<!-- More HTML -->

这里明显的缺点是你的所有模型必须从BaseModel类派生,否则部分视图会抛出错误。