如何让Action中的id显示到查询字符串上.
最近遇到一比较恶心的问题:
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}节的方法.