2011-07-18 136 views
6

ASP.NET MVC3/Razor。MVC3 URL編碼?

我發現,當我創建一個操作環節,比方說,像這樣:

@Html.ActionLink(product.Title, "Detail", "Products", new { id = product.ProductID }, null) 

的MVC3引擎創建我的產品鏈接。例如:

http://myhost/{ActionUrl}/PRODID 

但是,如果我的產品ID包含任何特殊字符,則它不會被URL編碼。

http://myhost/{ActionUrl}/PROD/ID 

當然,這打破了我的路由。 我的問題是:

  1. 我應該期望它能自動對URL進行編碼嗎?有什麼辦法可以設置它嗎?
  2. 如果不是,那麼對它們進行編碼和解碼的最簡潔的方法是什麼?我真的不想在每個控制器中這樣做。

謝謝!

回答

4

如果您的ID包含特殊字符,我建議您將它作爲查詢字符串傳遞,而不是路徑的一部分。如果沒有爲顛簸的道路做好準備。結帳following blog post

+0

我花了一段時間才意識到,但你的回答完全正確。某些字符就像保留的關鍵字,你無法做任何事情。對於其他人,你可以做怪異的事情,甚至可以使用全路徑,但一些特殊字符只能保持這種方式(除非你想用正則表達式重寫)。 – Alpha

+1

那麼作爲查詢字符串的代碼是什麼? –

1

我沒有得到這個路徑中的工作,但要使這項工作作爲@Darin在此間指出,通過查詢字符串參數是代碼:

@Html.ActionLink(product.Title, "Detail", "Products", new { id = product.ProductID }, "") 

創建ActionLink的作爲查詢字符串我這樣的:Products/Detail?id=PRODUCTID

我在Global.asax.cs中的路線是這樣的:

routes.MapRoute(
     "ProductDetail", 
     "Products/Detail", 
     new { controller = "Products", action = "Detail" } 
     ); 

在我ProductController的:

public ActionResult Detail(string id) 
{ 
    string identifier = HttpUtility.HtmlDecode(id); 
    Store.GetDetails(identifier); 
    return RedirectToAction("Index", "Home"); 
} 
+0

當「PRODUCTID」包含「/」或「#」時會發生什麼?控制器收到什麼? – Alpha

+0

控制器接收/編碼爲%2f。 HttpUtility.HtmlDecode會將其轉換回斜線。我沒有代碼設置來測試#但我期望控制器將收到%23 –

+0

謝謝,它確實有道理。我看到你也將它移動到查詢字符串,但我正在使用它的路徑部分。即使編碼,它也會打破路徑的形成。我正在尋找一種處理路徑中的方法。謝謝! – Alpha