How to change View & partial view default location

后端 未结 2 1255
盖世英雄少女心
盖世英雄少女心 2020-12-30 14:41

i am new in MVC and very curious about to know that how could i change view & partial view location.

we know that view & partial view store in view folder. i

2条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-12-30 14:59

    If you want to have a special views locations for specific controllers, in your case you want ProductController views to go to MyProduct folder, you need to to override FindView and FindPartialView methods of RazorViewEngine:

    public class MyRazorViewEngine : RazorViewEngine
    {
        public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
        {
            if (controllerContext.Controller is ProductController)
            {
                string viewPath = "/Views/MyProduct/" + viewName + ".cshtml";
                return base.FindView(controllerContext, viewPath, masterName, useCache);  
            }
    
            return base.FindView(controllerContext, viewName, masterName, useCache);
        }
    
        public override ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache)
        {
            if (controllerContext.Controller is ProductController)
            {
                string partialViewPath = "/Views/MyProduct/Partials/" + partialViewName + ".cshtml";
                return base.FindPartialView(controllerContext, partialViewPath, useCache);
            }
    
            return base.FindPartialView(controllerContext, partialViewName, useCache);
        }
    }
    

    And if you maybe want to prepend "My" to every controller views folder, your view engine should look like this

    public class MyRazorViewEngine : RazorViewEngine
    {
        public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
        {
            string viewPath = "/Views/My" + GetControllerName(controllerContext) + "/" + viewName + ".cshtml";
            return base.FindView(controllerContext, viewPath, masterName, useCache);
        }
    
        public override ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache)
        {
            string partialViewPath = "/Views/My" + GetControllerName(controllerContext) + "/Partials/" + partialViewName + ".cshtml";
            return base.FindPartialView(controllerContext, partialViewPath, useCache);
        }
    
        private string GetControllerName(ControllerContext controllerContext)
        {
            return controllerContext.RouteData.Values["controller"].ToString();
        }
    }
    

    And than in your Global.asax

    protected void Application_Start()
    {
        //remove unused view engines, for performance reasons as well
        ViewEngines.Engines.Clear();
        ViewEngines.Engines.Add(new MyRazorViewEngine());
    }
    

提交回复
热议问题