六、Asp.Net MVC4.0開發CMS系統案例之路由規則修改

    今天開放的時候,發現如果我要把生成View視圖頁csthtml建立多個文件夾目錄下面,contraller就找不到了。實際開發工作中,不可能所有生成的視圖都放在View下面的一級文件夾下,對於系統的代碼管理不是十分科學,於是我就嘗試如何讓它實現。

    比如登錄功能,控制器建立的路徑爲:Contrallers/Sys/Com/UserContraller.cs.如圖:


wKioL1R23A_yLhAbAABMbwMWnrU188.jpg

    系統添加視圖默認生成View的路徑爲:View/User/UserLogin.cshtml.如果我要把路徑改爲View/Sys/Com/UserLogin.cshtml,與Contraller的保持一直,就會報錯系統找不到它。

wKiom1R23NHCY4myAAJlK7u6Cu4900.jpg

    系統默認的規則只會到view/user/裏面搜索。這是因爲路由設置了/view/{contraller}/{action}/id 規則,當文件被移走之後就找不到了。因此我們需要通知真正的位置在哪裏。

wKiom1R234uReXL5AABpUqWssDc197.jpg

自定義路由規則,在App_Start文件夾下新建一個類MyRoute.繼承自RazorViewEngine 對選擇視圖方法FindView進行重寫。編寫代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Hillstone.App_Start
{

    public sealed class MyRoute : RazorViewEngine
    {
        /// <summary>
        /// 自定義路由規則
        /// </summary>
        public MyRoute()
        {
            ViewLocationFormats = new[]
            {
                "~/Views/{1}/{0}.cshtml",
                "~/Views/Shared/{0}.cshtml",
                "~/Views/Sys/Com/{1}/{0}.cshtml"
            };
        }
        public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
        {
            return base.FindView(controllerContext, viewName, masterName, useCache);
        }

    }
}

讓將這個路由規則在Global中註冊,註冊方法如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using Hillstone.DAL;
using Hillstone.App_Start;

namespace Hillstone
{
    // 注意: 有關啓用 IIS6 或 IIS7 經典模式的說明,
    // 請訪問 http://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_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>(new Initializer());
        }
        protected void RegisterView()
        {
            ViewEngines.Engines.Clear();
            ViewEngines.Engines.Add(new MyRoute());
        }
    }
}

運行OK.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章