我正在使用带有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文件中,认为它可以在所有视图中使用,但它不是
如果我知道视图是哪种类型,我认为它可以轻松扩展,任何帮助都会受到赞赏
答案 0 :(得分: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";
}
}
}
这应该适用于强类型视图,看起来像剃刀所有视图都是强类型的,当你没有定义类型'dynamic'时使用,那就是强类型
另外,正如Clicktricity所说,然后更新web.config(Views目录下的那个)
<pages pageBaseType="MyMvcWebApp.Extensions.ViewBase">
答案 1 :(得分:13)
正如其他人所说,Razor Views最终都继承自WebViewPage:
public abstract class WebViewPage<TModel> : WebViewPage
因此,您可以简单地为WebViewPage编写扩展方法,而无需创建新的基类或更改配置文件,这已由其他答案建议。例如:
public static class WebViewPageExtensions
{
public static string HollowWorld(this WebViewPage wvp)
{
return "Memento mori";
}
}
将该命名空间的using语句添加到View中,然后:
<p>@this.HollowWorld()</p>
答案 2 :(得分:1)
Razor视图的默认基类在views目录中的Web.config中指定。通常是:
<pages pageBaseType="System.Web.Mvc.WebViewPage">
我没有尝试过,但我建议继承这个基类并添加自己的功能,然后相应地调整web.config。
答案 3 :(得分:1)
使用razor引擎调用带参数的方法的最佳方法是使用帮助程序。 示例:让你有一个帮助@MakeNote(字符串内容)
然后在cshtml页面中你只需要调用@MakeNote(“你好”)就可以了。你应该没问题。
当我遇到问题时,我发疯了然后谷歌发送给我这个页面,但它没有帮助。我试图使用razor使用L2E在html <select>
中加载内容。
秘诀是在app_code中创建一个帮助器,然后与cshtml一起使用。