2012-04-20 127 views
7

我試圖支持一些遺留的URL,並將它們映射到控制器操作。該網址是這樣的:具有特殊字符的MVC路線

/~Home+Office~Note+Pads.html 

這裏是我的路線:

routes.MapRoute(
    "LegacyCategory", 
    "{path}.html", 
    new { controller = "LegacyCI", action = "Index", } 
); 

這裏是(的開始)我的控制器來對付他們:

public class LegacyCIController : Controller { 
    public ActionResult Index(string path) { 
     if (path == "~Address+Labels") { 
      return RedirectToAction("Display", "Category", new { id = "AddressLabels" }); 
     }  
     return RedirectToAction("Index", "Category"); 
    } 
} 

如果我在設置斷點LegacyCIController,並且我將我的起始頁設置爲XXX.html,斷點命中(並且失敗if),並且生活很好。但是,當我嘗試將起始頁設置爲~Address+Labels.html時,沒有發生斷點,Chrome只是嘔吐並向我顯示一個頁面,上面寫着「oops,這個頁面似乎已被破壞」。

我正在通過我的機器上的IIS 7運行此頁面,而不是Visual Studio。

這個URL格式不正確,以至於一個普通的MVC路由甚至無法處理它,或者我在做其他事情上有錯嗎?

+6

哇,這是一個很漂亮的文件名。 – Tejs 2012-04-20 18:13:07

+0

@Tejs - 是的,是的。處理遺留的東西是生活中真正的樂趣之一:) – 2012-04-20 18:14:09

+0

我的理論是IIS反彈請求 - 我認爲IIS7有一個黑名單的URL字符集。 – Tejs 2012-04-20 18:16:16

回答

0

嘗試使用HandleUnknownAction。在你的控制器:但是

<system.webServer> 
    <security> 
     <requestFiltering allowDoubleEscaping="true"> 
     </requestFiltering> 
    </security> 
    </system.webServer> 

,作爲解釋:

protected override void HandleUnknownAction(string actionName) { 
    if(Request.Path == "/~Address+Labels.html") { 
    RedirectToAction("Display", "Category").ExecuteResult(ControllerContext); 
    } else { 
    base.HandleUnknownAction(actionName); 
    } 
}