zoukankan      html  css  js  c++  java
  • ASP.NET MVC学习笔记-----使用自定义的View Engine

    我们都知道在ASP.NET MVC中自带了Razor View Engine,Razor十分的强大,可以满足我们绝大部分的需要。但是ASP.NET MVC的高度可扩展性,使我们可以使用自定义的View Engine,以满足我们自己的特殊需要。

    首先,实现自定义的View Engine需要实现IViewEngine接口:

        public interface IViewEngine
        {
            //使用指定的控制器上下文查找指定的分部视图。
            ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache);
            //使用指定的控制器上下文来查找指定的视图。
            ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache);
            //使用指定的控制器上下文来释放指定的视图。
            void ReleaseView(ControllerContext controllerContext, IView view);
        }

    我们可以看出,View Engine的主要职责就是通过ControllerContext(包含HttpContext和当前Controller实例)和ViewName来查找指定视图,最终返回的是ViewEngineResult

    ,那么ViewEngineResult是什么呢?来看看ViewEngine的源码:

    namespace System.Web.Mvc
    {
        public class ViewEngineResult
        {
            public ViewEngineResult(IEnumerable<string> searchedLocations)
            {
                if (searchedLocations == null)
                {
                    throw new ArgumentNullException("searchedLocations");
                }
    
                SearchedLocations = searchedLocations;
            }
    
            public ViewEngineResult(IView view, IViewEngine viewEngine)
            {
                if (view == null)
                {
                    throw new ArgumentNullException("view");
                }
                if (viewEngine == null)
                {
                    throw new ArgumentNullException("viewEngine");
                }
    
                View = view;
                ViewEngine = viewEngine;
            }
    
            public IEnumerable<string> SearchedLocations { get; private set; }
            public IView View { get; private set; }
            public IViewEngine ViewEngine { get; private set; }
        }
    }

    ViewEngineResult有两个构造函数。如果你的View Engine针对一个请求能够提供view,那么就可以使用

    public ViewEngineResult(IView view, IViewEngine viewEngine)

    如果你的View Engine不能提供view,那么可以使用

    public ViewEngineResult(IEnumerable<string> searchedLocations)

    参数searchedLocations表示寻找view的命名空间集合。

    在实现自定义的View Engine后,要如何才能MVC使用它呢,我们需要将View Engine添加到ViewEngines.Engines集合中:

        public class MvcApplication : System.Web.HttpApplication
        {
            protected void Application_Start()
            {
                AreaRegistration.RegisterAllAreas();
                ViewEngines.Engines.Insert(0, new DebugDataViewEngine());
    
                WebApiConfig.Register(GlobalConfiguration.Configuration);
                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
                RouteConfig.RegisterRoutes(RouteTable.Routes);
            }
        }

    因为MVC可以注册多个View Engine并且是按索引顺序使用View Engine来处理请求,如果我们想让自定义的View Enginge优先处理请求,那么就需要将它放在索引0的位置。

  • 相关阅读:
    mysql的undo log和redo log
    MySQL表的定期分析检查优化
    MySQL 数据库设计总结
    Innodb引擎下mysql自身配置优化
    linux的top命令参数详解
    InnoDB的关键特性-插入缓存,两次写,自适应hash索引
    第一次接私活亲身经历
    码农与技术控
    软件公司与非软件公司区别(纯个人看法)
    SQL Server表 & 存储过程 创建日期查询
  • 原文地址:https://www.cnblogs.com/hao-dotnet/p/3292430.html
Copyright © 2011-2022 走看看