MVC3视图继承不可能?

时间:2011-09-01 12:16:49

标签: asp.net-mvc-3 inheritance razor

我想创建一个抽象基本视图(包含许多带有cshtml的虚拟方法) 然后创建一个派生视图,可以选择覆盖这些方法来自定义视图:

例如:

override void Header(string title) {
 <div class="massive">@title</div>
}

如何用剃刀实现这一目标?

(不是每个人都想/需要这样做吗?)

4 个答案:

答案 0 :(得分:7)

开箱即用并不是那么好用,虽然我确信你可以通过一些努力来实现这一目标。

相反,您可以使用已定义的Layouts创建Sections,然后根据需要从添加新部分的其他布局中派生出其他布局。然后,视图将通过

声明它正在使用的布局
@{
    Layout = "_Layout.cshtml" // app relative path to layout
}

并可以根据需要使用

为任何部分提供标记
@section SectionName {
    <p>I'm markup to go into a section in the layout this view is using</p>
}

您可以通过ViewData和/或ViewBag传递数据,因此如果您愿意,可以使用它们来传递代理。

或者,您可以决定向[{1}},HtmlHelper添加扩展方法,甚至创建从UrlHelper派生的WebViewPage,并在您的派生类型中添加任何其他属性/方法然后将其设置为视图使用的web.config中System.Web.Mvc.WebViewPage中的pageBaseType

答案 1 :(得分:7)

答案 2 :(得分:1)

只需使用sections and layouts即可。您可以将包含某些默认内容的布局定义为可在子视图中重写的部分。您可以使用布局中的IsSectionDefined方法来测试子视图是否会覆盖此部分,如果不提供默认内容。

答案 3 :(得分:1)

我发现最干净的方法是使用App_Code中声明的@helper 以委托为参数:

@helper Example(Func<int, HelperResult> fn1, Func<int, HelperResult> fn2) {
 <div>@fn1(100)</div>
 <div>@fn2(200)</div>
}

然后使用辅助函数创建一个视图:

@helper Custom1(int x) { <span class="small">@x</span> }
@helper Custom2(int x) { <span class="big">@x</span> }

然后像这样调用共享助手:

@Example(Custom1, Custom2)

并且,如果需要,共享帮助程序可以在委托为空时实现默认行为

这比简单地使用一些覆盖虚拟助手实现派生视图要麻烦得多 - 但至少它有效,是强类型的,并且不使用动态