最近遇到一比較噁心的問題:
TestController中有Action如下
1 public ActionResult Index(Question question)
2 {
3 return View(question);
4 }
其中參數Question定義如下:
1 public class Question
2 {
3 public string Id { get; set; }
4 public string Name { get; set; }
5 }
那麼我通過Html.ActionLink("樣本","Index","Test",new Question{Id="12312312312",Name="asdfasdfasdf"},null)產生的a標籤的href是:
http://..../Test/Home/12312312312?Name=asdfasdfasdf
就是說它把Id預設放置到了Route裡面了(究其根本是因為我們有預設的route: {controller}/{action}/{id},這裡面的id跟我們的Id重名的原因).這本無所厚非,因為服務端的Action也能正常的綁定參數.但是變態的是,我的Id裡面經常會包含 "/" 比如
Html.ActionLink("樣本","Index","Test",new Question{Id="123/123/123/12",Name="asdfasdfasdf"},null)
這行代碼,產生的結果就是: http://..../Test/Home/123/123/12312?Name=asdfasdfasdf 這肯定是一個非法的url.而且即使我通過Url.Encode把Id的值Encode一下以後雖然看起來似乎是正確的了: http://localhost:3427/Test/Index/123%252f123%252f12312?Name=asdfg 但是由於到了服務端後%252f還會變成/然後再去進行action controller id的匹配,所以就導致我們的id的值還是123/123/12312.這個問題確實比較糾結.
解決方案:
(1):既然是由於預設路由裡麵包含了id這個節的原因而導致id被放在route裡面的,那麼我們可以從預設的route入手,我們可以把預設的路由中的id變成別的,比如 myid: {controller}/{action}/{myid},或者乾脆直接刪除{id}這段.其實也可以通過在{*id}這種形式來強迫123/123/12312匹配給id,但是這種形式牽涉面太廣了,容易影響別的代碼,綜合考慮我選用了直接刪除{id}節的方法.