2014-03-03 64 views
1

我有一個動作鏈接,該鏈接如下:ActionLink的斜線包含(「/」)和中斷鏈接

<td>@Html.ActionLink(item.InterfaceName, "Name", "Interface", new { name = item.InterfaceName}, null)</td> 

item.InterfaceName從數據庫中收集的,並且是FastEthernet0/0。這導致我的HTML鏈接被創建爲導致"localhost:1842/Interface/Name/FastEthernet0/0"。有沒有辦法使"FastEthernet0/0"的URL友好,以便我的路由不會感到困惑?

回答

3

您可以通過替換斜槓來解決此問題。

ActionLink(item.InterfaceName.Replace('/', '-'), ....) 

在此之後,您的鏈接將如下所示:localhost:1842/Interface/Name/FastEthernet0-0。 當然,你在你的控制器ActionMethod會表現不好,因爲它會期待一個良好命名的接口,因此在調用該方法,你需要恢復的更換:

public ActionResult Name(string interfaceName) 
{ 
    string _interfaceName = interfaceName.Replace('-','/'); 
    //retrieve information 
    var result = db.Interfaces... 

} 

另一種方法是建立一個自定義路線追趕您的要求:

routes.MapRoute(
    "interface", 
    "interface/{*id}", 
    new { controller = "Interface", action = "Name", id = UrlParameter.Optional } 
); 

Your method would be: 

public ActionResult Name(string interfaceName) 
{ 
    //interfaceName is FastEthernet0/0 

} 

該解決方案建議由達林季米特洛夫here

0

你可能有name作爲擴聲路徑定義中URL路徑的rt。把它拿走,它將被正確地發送,就像一個URL參數,URL編碼。

0

您應該使用Url.Encode,因爲不僅僅是「/」字符,還有其他像「?#%」也會在URL中被破壞! Url.Encode替換每一個需要被編碼的字符,這裏的人的名單:

http://www.w3schools.com/TAGs/ref_urlencode.asp

這將是一個相當大的對與string.replace寫自己正確的一個。如此使用:

<td>@Html.ActionLink(item.InterfaceName, "Name", "Interface", new { name = Url.Encode(item.InterfaceName)}, null)</td> 

當作爲參數傳遞給動作方法時,Urlencoded字符串會自動解碼。

public ActionResult Name(string interfaceName) 
{ 
    //interfaceName is FastEthernet0/0 
} 

item.InterfaceName.Replace( '/', ' - ')是完全錯誤的,例如, 「快速以太網-0/0」 將被稱爲 「快速以太網-0-0」 傳遞和解碼,以「快速以太網/ 0/0「這是錯誤的。

+0

如果您編碼一個斜線,並將其打印爲斜槓,它仍然會破壞路線。在我小小的世界裏,我使用cisco設備的地方,OP的命名約定是唯一有效的。可能與供應商有所不同,但我從未見過不同的命名方案。 – Marco