我正在使用带有asp mvc预览3的Razor视图
我正在尝试创建一些我希望直接在视图中可用的方法.这些不是真正的Html辅助方法,所以我不认为扩展HtmlHelper有意义吗?
我的目标,能够在视图中调用方法即
@HelloWorld(); vs @Html.HelloWorld()
我可以通过在HtmlHelper上创建扩展方法来使Html.HelloWorld工作
public static class HtmlExtensions { public static string HelloWorld(this HtmlHelper helper) { return "Hello"; } }
我想做同样的事情但是为了观点; 我的问题 - 视图是什么类型的对象?
注意:我可以通过在.cshtml页面中定义方法来实现此功能
@functions { public string HelloWorld() { return "Hello"; } } @HelloWorld() @* now this works *@
然后我试着把这个代码放在我的_viewstart.cshtml文件中,认为它可以在所有视图中使用,但事实并非如此
如果我知道视图是哪种类型我认为它可以很容易地扩展,任何帮助表示赞赏
事实证明,asp运行时将在运行时定义Execute方法,因此自定义视图基类也必须是抽象的
using System; using System.Web.Mvc; namespace MyMvcWebApp.Extensions { public abstract class ViewBase: System.Web.Mvc.WebViewPage where TModel : class { // now this will be available in any view @HelloWorld() public string HelloWorld() { return "Hello from the ViewBase class"; } } }
这应该适用于强类型视图,它看起来像剃刀所有视图都是强类型的,当你没有定义类型'动态'使用,这是强类型
另外,正如Clicktricity所述,然后更新web.config(Views目录下的那个)
正如其他人所说,Razor Views最终都继承自WebViewPage:
public abstract class WebViewPage: WebViewPage
因此,您可以简单地为WebViewPage编写扩展方法,而无需创建新的基类或更改配置文件,这已由其他答案建议.例如:
public static class WebViewPageExtensions { public static string HollowWorld(this WebViewPage wvp) { return "Memento mori"; } }
将该命名空间的using语句添加到View中,然后:
@this.HollowWorld()