2010-05-20 3 views
4

Похоже, straitforward вопрос, но я не могу вполне понять это сам ...QueryString форматирования в asp.net MVC 2

У меня есть ActionLink как так

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

Это создает URL строка следующим

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

Но я хотел бы сохранить знак плюс (который я предполагаю, что в настоящее время UrlPathEncoded), так что я получаю следующий URL

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

Есть простой способ сделать это в то время как до сих пор используют Html.ActionLink?

ответ

3

После еще нескольких поисковых запросов, я задал вопрос в 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; 
    } 
} 

Это расширение затем вызывается методом RegisterRoutes в global.asax как так ...

 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 станет «поиск твиттер» на пост обратно, и добиться этого эффекта, вы можете просто использовать «поиск твиттер» в первую очередь:

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

, который будет генерировать следующий URL

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

Надеюсь, это поможет.

+0

Спасибо за ответ. Однако на самом деле я хочу иметь http: // myserver/test? Q = search + twitter в качестве URL-адреса в моем браузере, и я все еще в тупике относительно того, как вы можете это достичь. – Stuart

+0

Если это ваша цель, одним из решений может быть создание собственного метода расширения для HtmlHelper для генерации URL-адреса. –

+0

-1: Этот ответ в основном перефразирует вопрос, но не предлагает никакого решения. –

Смежные вопросы