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

相關文章
相關標籤/搜索