代码之家  ›  专栏  ›  技术社区  ›  house9

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

  •  19
  • house9  · 技术社区  · 14 年前

    我将Razor View与ASP MVC预览3结合使用

    我正在尝试创建一些我希望直接在视图中可用的方法。这些不是真正的HTML助手方法,所以我认为扩展HTML助手没有意义?

    我的目标是,能够在视图中调用方法,即

    @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 回复  |  直到 10 年前
        1
  •  13
  •   Rob Kent andersra    14 年前

    正如其他人所说,Razor视图最终都继承自WebViewPage:

    public abstract class WebViewPage<TModel> : WebViewPage
    

    因此,您可以简单地为WebViewPage编写扩展方法,而无需创建新的基类或更改由其他答案建议的配置文件。例如:

    public static class WebViewPageExtensions
    {
        public static string HollowWorld(this WebViewPage wvp)
        {
            return "Memento mori";
        }
    }
    

    将该命名空间的using语句添加到视图中,然后:

    <p>@this.HollowWorld()</p>
    
        2
  •  13
  •   Owen Blacker Aditya    10 年前

    事实证明,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";
            }
        }
    }
    

    这应该适用于强类型视图,在Razor中,所有视图看起来都是强类型的,如果不定义使用的类型是“dynamic”,而这是强类型

    此外,如clicktricity所述,然后更新web.config(views目录下的web.config)。

    <pages pageBaseType="MyMvcWebApp.Extensions.ViewBase">
    
        3
  •  1
  •   Clicktricity    14 年前

    Razor视图的默认基类在views目录中的web.config中指定。通常是:

    <pages pageBaseType="System.Web.Mvc.WebViewPage">
    

    我没有尝试过,但是我建议继承这个基类并添加您自己的功能,然后相应地调整web.config。

        4
  •  1
  •   Zhaph - Ben Duguid    11 年前

    使用Razor引擎调用带有参数的方法的最佳方法是使用助手。 示例:让您有一个助手@makenote(字符串内容)

    然后在cshtml页面中,您只需调用@makenote(“hi”),就可以了。

    当我有问题的时候我疯了,然后谷歌把我发送到这个页面,但它没有帮助。我试图用HTML加载内容 <select> L2e使用剃刀。

    秘密是在app代码中创建一个助手,然后与cshtml一起使用。