在Razor视图

在Razor视图

问题描述:

这里违约一节就是我试图解决的情况:在Razor视图

我有一个单节@RenderSection(“菜单”),主共享的布局,我想默认为标准菜单对于我的大部分页面,但我想在几个子页面中替换/覆盖该部分。在游戏的这个阶段,Razor可以实现吗?

我希望我可以在_ViewStart.cshtml中定义该部分的默认实现,但它似乎并不喜欢它。

菜单局部视图会更适合这种情况吗?

编辑:

我得到下面的错误与下面这段代码:以下各节已确定,但尚未呈现的页面布局“〜/查看/共享/ _Layout.cshtml”:“菜单”。

_Layout.cshtml

  <div id="menu"> 
@if (IsSectionDefined("menu")) 
{ 
    RenderSection("menu"); 
} 
else { 
    <text> 
      <ul> 
       <li>@Html.ActionLink("Home", "Index", "Home")</li> 
       <li><a href="#">Lookups</a> 
        <ul> 
         @Html.ActionLink("Product","Index","Product") 
        </ul> 
       </li> 
      </ul> 
    </text> 
} 
     </div> 

Index.cshtml

@section menu { 
      <ul> 
       <li>@Html.ActionLink("Product", "Index", "Product")</li> 
       <li>@Html.ActionLink("Form Type", "Index", "Product")</li> 
       <li>@Html.ActionLink("Supplier", "Index", "Product")</li> 
      </ul> 
    } 

啊......我被这个搞乱,发现我可以就在切换逻辑做到这一点:

@RenderSection("Header", false) 
@if (!IsSectionDefined("Header")) { 
<header> 
    Default Header! 
</header> 
} 

所以,如果我的网页没有定义@section Header { ... },它呈现的默认值。

+0

谢谢安迪。这对我来说效果很好,我认为它比单独的菜单部分清洁一点。 – 2010-12-08 19:47:56

IsSectionDefined方法应该适合你的需求:

@if(IsSectionDefined("Menu")) { 
    @RenderSection("Menu") 
} else { 
    <text> 
     Default Menu Content. 
    </text> 
} 

更新:我写了一篇博客文章,以更好地说明可用选项:http://blogs.msdn.com/b/marcinon/archive/2010/12/08/Optional-Razor-Sections-with-Default-Content.aspx

+0

谢谢,我已经给它一个去了,但我得到:以下部分已定义,但尚未呈现布局页面“〜/ Views/Shared/_Layout.cshtml”:“菜单”。我会将我的代码添加到OP中以显示我所做的事情。 – 2010-11-17 21:53:14

+2

我更新了代码以解决问题。你需要执行'@RenderSection()'而不是'RenderSection()' – marcind 2010-12-10 23:20:30

我目前使用多种布局来实现这个完全相同的场景。

/Views/Shared/_Layout.cshtml

<html> 
    ... 
    <body> 
    <div id="menu">@RenderSection("Menu", required:false)</div> 
    ... 
    @RenderBody() 
    ... 
    </body> 
</html> 

/Views/Shared/_LayoutWithDefaultMenu.cshtml

@{ Layout = "~/Views/Shared/_Layout.cshtml"; } 
@section Menu { @Html.Partial("Menu") } 
@RenderBody() 

/Views/_ViewStart.cshtml

@{ Layout = "~/Views/Shared/_LayoutWithDefaultMenu.cshtml"; } 

这意味着,默认情况下,我的所有视图都会使用默认菜单获取布局。但是,在逐个视图的基础上,我可以将布局设置为_Layout.cshtml,然后自己执行@section Menu

+0

我试过这两种方法,尽管我认为另一种方法比较干净,但是在另一种方法中我工作的时候,编辑。 – 2010-11-18 00:56:18