我想创建一个抽象基本视图(包含许多带有cshtml的虚拟方法) 然后创建一个派生视图,可以选择覆盖这些方法来自定义视图:
例如:
override void Header(string title) {
<div class="massive">@title</div>
}
如何用剃刀实现这一目标?
(不是每个人都想/需要这样做吗?)
答案 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)
我相信使用Helper方法比在视图上尝试继承模型更好。使用Scott Gu的博客作介绍:
http://www.asp.net/mvc/tutorials/creating-custom-html-helpers-cs
答案 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)
并且,如果需要,共享帮助程序可以在委托为空时实现默认行为
这比简单地使用一些覆盖虚拟助手实现派生视图要麻烦得多 - 但至少它有效,是强类型的,并且不使用动态