關於MVC Area Routing的怪異問題
![圖片](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX5wSB132u8UisB6sSBR0nxZH3FuSroOqxSYbSrlNhw6kufPUo-v5PkxbpPC6T1vtx9jR4iRU72U3NEM979Elut32-u7gN8-hpOneqhNAI4LzzeLqlAmQJcqb_Ndzr6kNAFcSnpnRGJuA/s640/914c7f18f49b66410b073e88e78f83d4-763335.png)
問題 同事反應了一個關於MVC Area的怪異問題。客戶自行輸入一個不存在的網址,本應該出現404找不到,但卻發生Exception。如下圖,找到JiahuaController的Index,但找不到View。 原因 Route往子層的Area比對到了,專案的層級如下: Root/Home/Index Kim(Area/ Jiahua /Index 一般來說,瀏覽/Jiahua會比對到上層預設的Route,而透過namespace的限制,照理來說不會往Area比對才對。如下圖,結果,它是在此namespace比對不到後,又往area的contoller尋找...昏。 解決方式 以下兩個擇一即可解決: 1.透過自訂Route,只比對上層的Controller。ps:此方法不是最佳解,這是在找到最佳解前實作出來的。 /// <summary> /// 此類別的建講式只會被執行一次 /// http://johnatten.com/2013/08/21/customizing-routes-in-asp-net-mvc/ /// https://stackoverflow.com/questions/21583278/getting-all-controllers-and-actions-names-in-c-sharp/21583402 /// </summary> public class IsRootController : IRouteConstraint { private Dictionary<string, string> _rootControllers = new Dictionary<string, string>(); public IsRootController() { Assembly asm = Assembly.GetExecutingAssembly(); var _rootControllers = asm.G