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