ASP.NET MVC学习笔记-----使用自定义的View Engine

咱们都知道在ASP.NET MVC中自带了Razor View Engine,Razor十分的强大,能够知足咱们绝大部分的须要。可是ASP.NET MVC的高度可扩展性,使咱们能够使用自定义的View Engine,以知足咱们本身的特殊须要。函数

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

    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来查找指定视图,最终返回的是ViewEngineResultcode

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

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的命名空间集合。get

在实现自定义的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的位置。string

相关文章
相关标签/搜索