ASP.NET MVC Custom View Routing

前端 未结 1 2065
故里飘歌
故里飘歌 2020-12-17 04:45

Our solution hierarchy is as follows:

Controller\\Category\\View

Ex: Controllers\\DataAnalysis\\DataRetrieve

Now I\'d like to map the routing so that

相关标签:
1条回答
  • 2020-12-17 05:27

    If I understood your question correctly, you can create your own view engine which resolves view location at runtime and plug into your application.

    Create your own custom view engine.

        public class MyViewEngine : RazorViewEngine
    {
        public MyViewEngine()
            : base()
        {
            ViewLocationFormats = new[] {
            "~/Views/{1}/%1/{0}.cshtml",
            "~/Views/{1}/%1/{0}.vbhtml",
            "~/Views/Shared/{0}.cshtml",
            "~/Views/Shared/{0}.vbhtml"
        };
    
        PartialViewLocationFormats = new[] {
            "~/Views/%1/{1}/{0}.cshtml",
            "~/Views/%1/{1}/{0}.vbhtml",
            "~/Views/Shared/{0}.cshtml",
            "~/Views/Shared/{0}.vbhtml"
        };
        }
    
        protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
        {
            var catagoryName = controllerContext.RouteData.Values["category"].ToString();
            return base.CreatePartialView(controllerContext, partialPath.Replace("%1", catagoryName));
        }
    
        protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
        {
            var catagoryName = controllerContext.RouteData.Values["category"].ToString();
            return base.CreateView(controllerContext, viewPath.Replace("%1", catagoryName),masterPath);
        }
    
        protected override bool FileExists(ControllerContext controllerContext, string virtualPath)
        {
            var catagoryName = controllerContext.RouteData.Values["category"].ToString();
            return base.FileExists(controllerContext, virtualPath.Replace("%1", catagoryName));
        }
    
    }
    

    And register it here

    protected void Application_Start()
    {   
       AreaRegistration.RegisterAllAreas();
    
       RegisterGlobalFilters(GlobalFilters.Filters);
       RegisterRoutes(RouteTable.Routes);
    
    
       //Register your View Engine Here.
       ViewEngines.Engines.Add(new MyViewEngine());
    }
    

    Update route config, default should be

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{category}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", category = "DefaultCategoryName", id = UrlParameter.Optional }
            );
    
    0 讨论(0)
提交回复
热议问题