咱們都知道在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