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的位置。

posted @ 2013-08-30 20:16  浩GE  阅读(695)  评论(0编辑  收藏  举报