【问题标题】:asp.net mvs Section within a Partial/Section?部分/部分中的asp.net mvs部分?
【发布时间】:2014-03-06 16:51:48
【问题描述】:

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

My Shared/_Layout.cshtml 通过调用插入该代码

@Html.Partial("_Header")

到目前为止效果很好。

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

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

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

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

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

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

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

反过来不行吗?

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

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

【问题讨论】:

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


    【解决方案1】:

    如果一个视图包含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 类派生,否则局部视图会抛出错误。

    【讨论】:

    • 感谢您提供详细的答案和可能的解决方案。它帮助我理解了很多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多