2012-07-24 88 views
5

我想在路由表中創建路由到虛擬物品的路由(使用創建網址的cms,如example.com/about/company,其中沒有物理文件稱爲公司存在)使用system.web.routing(不幸的是我不能使用iis重寫/路由)。我已經嘗試了以下內容,但是結果是404。如果我要指向另一個物理文件(tor測試目的),則路由工作正常。路由到虛擬物品

void RegisterRoutes(RouteCollection routes) 
{ 
    routes.RouteExistingFiles = true; 
    routes.MapPageRoute("about", "about/us", "~/about/company", false); 
} 

那麼,是否可以指向這樣的項目?

+0

請看看這篇文章可能幫助你的文件夾結構路由:** HTTP://www.codeproject.com/Articles/77199/URL-Routing-with-ASP-NET- 4-0 ** – 2012-07-24 15:36:40

+0

感謝,但看起來像在文章中作者也指向了物理文件。 – xoail 2012-07-24 16:10:12

+0

是的,但如果我認爲正確,應該重定向到物理文件並顯示內容取決於您傳遞的值。此外,文章指出的參考資料有一些很好的信息! – 2012-07-24 16:13:06

回答

1

希望這會對你有所幫助,這個具體的例子是Sitecore,但是這個項目是開源的,我想這不會太難以重新設計你的解決方案所需的部分。

這個項目的要點是允許您使用帶有webforms解決方案的MVC路由引擎。我會補充說明,您需要深入瞭解代碼,但希望能夠讓您走上正確的軌道。

https://github.com/Sitecore/Sitecore-Mvc-Routing

1

你將無法用MapPageRoute完成你想要的目標。 MapPageRoute通過使用PageRouteHandler創建一個新的Route來工作。爲PageRouteHandler Class的文件明確規定:

您在 爲了圖一個物理文件的URL傳遞PageRouteHandler的實例來路由構造。 PageRouteHandler對象 指定物理文件的虛擬路徑,並確定是否檢查物理URL的授權規則 。

如果這是一個MVC應用程序,在RouteCollectionExtensions Class中有路由擴展。您應該能夠使用MapRoute方法和餵養它必要的默認參數,象這樣的MvcRouteHandler創造新幹線:

routes.MapRoute("about", "about/us", new { controller = "about", action="company", id="" }); 

你需要把適當的值,因爲我不知道你的控制器設計。另外,請看Creating Custom Routes (C#),這對理解MVC如何處理路由可能有所幫助。

如果這不是一個MVC應用程序,則必須實現從UrlRoutingHandler Class派生的自定義路由處理程序,並向RouteCollection添加一個新的Route。

+0

這不是一個mvc應用程序。任何指導/例子指出創建自定義路由處理程序? – xoail 2012-07-27 21:35:17

+0

我還沒有自己嘗試過,但我認爲你可能只需重寫派生處理程序中的ProcessRequest方法,並讓它執行'Response.Redirect'調用。 http://msdn.microsoft.com/en-us/library/cc680109(v=vs.90).aspx – JamieSee 2012-07-27 23:15:09

1

爲了路由到像/content/something這樣的無擴展目標,您需要在IIS應用程序池中使用集成模式。如果你不能改變這一點,那麼除了設置一個自定義的404處理程序,以及從那裏手動處理URL之外,沒有簡單的方法來做你想做的事情。這可能是你404錯誤的原因。

此外,RouteExistingFiles應該是錯誤的。您正嘗試將不存在的文件作爲文件路由。如果您設置了RouteExistingFiles = true,則當路線匹配時,不會使用存在的文件的默認處理。你所要做的就是處理不存在的路徑,但是代表來自數據庫的內容,對吧?所以留下這個假。

最後,您的MapPageRoute聲明似乎不正確。例如,在微軟的演練中,它可能看起來像:http://msdn.microsoft.com/en-us/library/dd329551.aspx

routes.MapPageRoute("SalesRoute", 
    "SalesReport/{locale}/{year}", 
    "~/sales.aspx"); 

會導致匹配的路由響應調用sales.aspx。在你的例子中,目標是~/about/company,它看起來像一個路線,而不是一個實際的目標 - 你處理CMS請求的實際目標應該有一個aspx擴展名。