今天开放的时候,发现如果我要把生成View视图页csthtml建立多个文件夹目录下面,contraller就找不到了。实际开发工作中,不可能所有生成的视图都放在View下面的一级文件夹下,对于系统的代码管理不是十分科学,于是我就尝试如何让它实现。

比如登录功能,控制器建立的路径为:Contrallers/Sys/Com/UserContraller.cs.如图:


系统添加视图默认生成View的路径为:View/User/UserLogin.cshtml.如果我要把路径改为View/Sys/Com/UserLogin.cshtml,与Contraller的保持一直,就会报错系统找不到它。

系统默认的规则只会到view/user/里面搜索。这是因为路由设置了/view/{contraller}/{action}/id 规则,当文件被移走之后就找不到了。因此我们需要通知真正的位置在哪里。

自定义路由规则,在App_Start文件夹下新建一个类MyRoute.继承自RazorViewEngine 对选择视图方法FindView进行重写。编写代码如下:

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.Mvc;namespaceHillstone.App_Start{publicsealedclassMyRoute:RazorViewEngine{///<summary>///自定义路由规则///</summary>publicMyRoute(){ViewLocationFormats=new[]{"~/Views/{1}/{0}.cshtml","~/Views/Shared/{0}.cshtml","~/Views/Sys/Com/{1}/{0}.cshtml"};}publicoverrideViewEngineResultFindView(ControllerContextcontrollerContext,stringviewName,stringmasterName,booluseCache){returnbase.FindView(controllerContext,viewName,masterName,useCache);}}}

让将这个路由规则在Global中注册,注册方法如下:

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.Http;usingSystem.Web.Mvc;usingSystem.Web.Optimization;usingSystem.Web.Routing;usingHillstone.DAL;usingHillstone.App_Start;namespaceHillstone{//注意:有关启用IIS6或IIS7经典模式的说明,//请访问http://go.microsoft.com/?LinkId=9394801publicclassMvcApplication:System.Web.HttpApplication{protectedvoidApplication_Start(){AreaRegistration.RegisterAllAreas();WebApiConfig.Register(GlobalConfiguration.Configuration);FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);RouteConfig.RegisterRoutes(RouteTable.Routes);BundleConfig.RegisterBundles(BundleTable.Bundles);RegisterView();//注册视图访问规则//System.Data.Entity.Database.SetInitializer<HillstoneContext>(newInitializer());}protectedvoidRegisterView(){ViewEngines.Engines.Clear();ViewEngines.Engines.Add(newMyRoute());}}}

运行OK.