2010-05-20 88 views
4

格式似乎是一個straitforward的問題,但我不能完全弄清楚自己...查詢字符串在asp.net MVC 2

我有一個ActionLink的像這樣

Html.ActionLink("Test", "test", new { q = "search+twitter" }) 

這將產生一個網址字符串如下

http://myserver/test?q=search%2Btwitter

但我想保留的加號(我假設正在UrlPathEncoded),使我得到以下網址

http://myserver/test?q=search+twitter

是否有一個簡單的方法來做到這一點,同時還使用Html.ActionLink?

回答

3

經過一些更多的Google搜索後,我在this post中重寫了這個問題。使用這個問題的答案,我能夠將一個合適的路由擴展方法放在一起,我在下面包含這個方法。

public static class RouteCollectionExtensions 
{ 
    public static void CustomMapRoute(this RouteCollection routes, string name, string url, object defaults) 
    { 
     routes.CustomMapRoute(name, url, defaults, null, null); 
    } 

    public static void CustomMapRoute(this RouteCollection routes, string name, string url, object defaults, string[] namespaces) 
    { 
     routes.CustomMapRoute(name, url, defaults, namespaces, null); 
    } 

    public static void CustomMapRoute(this RouteCollection routes, string name, string url, object defaults, string[] namespaces, object constraints) 
    { 
     if (routes == null) 
      throw new ArgumentNullException("routes"); 

     if (url == null) 
      throw new ArgumentNullException("url"); 

     var route = new CustomRoute(url, new MvcRouteHandler()) 
     { 
      Defaults = new RouteValueDictionary(defaults), 
      Constraints = new RouteValueDictionary(constraints), 
      DataTokens = new RouteValueDictionary() 
     }; 

     if ((namespaces != null) && (namespaces.Length > 0)) 
     { 
      route.DataTokens["Namespaces"] = namespaces; 
     } 

     if (String.IsNullOrEmpty(name)) 
      routes.Add(route); 
     else 
      routes.Add(name, route); 
    } 
} 

public class CustomRoute : Route 
{ 
    public CustomRoute(string url, IRouteHandler routeHandler) 
     : base(url, routeHandler) { } 

    public CustomRoute(string url, RouteValueDictionary defaults, IRouteHandler routeHandler) 
     : base(url, defaults, routeHandler) 
    { } 

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) 
    { 
     var path = base.GetVirtualPath(requestContext, values); 
     if (path != null) 
     { 
      path.VirtualPath = path.VirtualPath.Replace("%20", "+"); 
     } 
     return path; 
    } 
} 

這個擴展,然後在Global.asax中的RegisterRoutes方法類似所謂的...

 routes.CustomMapRoute(
      "Default",            // Route name 
      "{controller}/{action}/{id}",       // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
      new string[] { "MyControllers" } 
     ); 
0

加號(編碼後)表示編碼前的空格。

所以search+twitter將成爲後「搜索Twitter」回來,以達到這樣的效果,你可以簡單地使用擺在首位「搜索Twitter」:

 
Html.ActionLink("Test", "test", new { q = "search twitter" }) 

這將產生以下網址

http://myserver/test?q=search%20twitter

希望這會有所幫助。

+0

感謝您的回答。但是我實際上想要在瀏覽器中使用http:// myserver/test?q = search + twitter作爲網址,而且我仍然難以確定如何實現這一目標。 – Stuart 2010-05-21 08:41:25

+0

如果這是您的目標,一種解決方案可能是爲HtmlHelper創建您自己的擴展方法來生成URL。 – 2010-05-21 17:23:39

+0

-1:這個答案基本上重述了這個問題,但並沒有提出任何解決方案。 – 2011-10-17 13:03:08

相關問題