【问题标题】:Extend Viewpage class with custom helper objects?使用自定义帮助对象扩展 Viewpage 类?
【发布时间】:2009-07-14 02:05:13
【问题描述】:

是否可以向 ViewPage 类添加自定义帮助对象,以便我可以在视图页面标记中使用它(就像 Html、Url 和 Ajax 一样)?这个帮助对象还需要来自自定义控制器的一些数据。 (我认为应该可以通过 ViewContext 属性实现)

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    创建新类,从 System.Web.Mvc.ViewPage 派生它,为自定义帮助程序添加新属性并覆盖 InitHelpers() 方法。例如:

    public class CustomViewPage : System.Web.Mvc.ViewPage
    {
        public YourCustomHelper CustomHelper
        {
            get;
            set;
        }
    
        public virtual void InitHelpers()
        {
            CustomHelper = new YourCustomHelper(ViewContext);
    
            base.InitHelpers();
        }
    }
    
    
    public class YourCustomHelper
    {
        public YourCustomHelper(ViewContext viewContext)
        {
            if (viewContext == null) {
                throw new ArgumentNullException("viewContext");
            }
    
            ViewContext = viewContext;
        }
    
        public ViewContext ViewContext
        {
            get;
            private set;
        }
    }
    

    【讨论】:

    • 感谢 eugene,我还创建了一个自定义控制器上下文并像这样访问它:CustomHelper = new YourCustomHelper(ViewContext.Controller.ControllerContext as CustomControllerContext);
    • +1!这是一个很好的解决方案,可惜它没有被标记为答案并且 OP 关闭了他的帐户....
    • 我无法让它工作,有什么特别需要做的才能使用CustomViewPage而不是普通的ViewPage
    • 为我工作,+1... 现在正在寻找一种方法来扩展 ViewMasterPage
    【解决方案2】:

    您可以使用扩展方法(现在在 .Net 3.5 中提供)非常轻松地做到这一点考虑这样的类:

    public static class ViewPageExtensions
    {
        public static string DoSomething(this ViewPage page, string input)
        {
            // Do something clever with the page
        }
    }
    

    只要您的 ViewPageExtensions 类对您正在处理的 ViewPage.aspx 上导入的命名空间可见,您就应该能够直接访问 DoSomething 方法,而无需参考 ViewPageExtensions 类.

    【讨论】:

    • 我自己尝试过这个 - 理论上很好,但看起来这实际上并不适用。 IDE 无法识别扩展方法。奇怪的是,从您的视图文件中,您可以执行诸如 之类的操作,但不能执行智能感知无法识别的 之类的操作,并导致运行时例外。
    • 这对<%=Page.DoSomething("input")%> 是否有效,因为它是ViewPageExtension
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 2013-06-12
    相关资源
    最近更新 更多