ASP MVC Razor视图扩展方法,如何创建'全局'视图方法?

时间:2010-10-20 16:17:33

标签: asp.net-mvc

我正在使用带有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文件中,认为它可以在所有视图中使用,但它不是

如果我知道视图是哪种类型,我认为它可以轻松扩展,任何帮助都会受到赞赏

4 个答案:

答案 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一起使用。