Форматирование строки запроса в asp.net MVC 2

Похоже на прямой вопрос, но я сам не могу его понять ...

У меня есть такая ссылка на действие

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?


person Stuart    schedule 20.05.2010    source источник


Ответы (2)


После еще нескольких поисков в Google я переформулировал вопрос в этот пост. Используя ответ на этот вопрос, я смог составить подходящий метод расширения маршрутизации, который я привожу ниже.

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" }
        );
person Stuart    schedule 25.05.2010

Знак плюс (после кодирования) представляет собой пробел перед кодированием.

Таким образом, search+twitter станет «искать в твиттере» при ответе на сообщение, и для достижения этого эффекта вы можете просто использовать «поиск в твиттере» в первую очередь:

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

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

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

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

person Bill Yang    schedule 20.05.2010
comment
Спасибо за ответ. Однако я действительно хочу иметь myserver / test? Q = search + twitter в качестве URL-адреса в моем браузер, и я все еще не понимаю, как вы могли бы этого добиться. - person Stuart; 21.05.2010
comment
Если это ваша цель, одним из решений может быть создание собственного метода расширения для HtmlHelper для генерации URL-адреса. - person Bill Yang; 21.05.2010
comment
-1: Этот ответ в основном перефразирует вопрос, но не предлагает никакого решения. - person Yann Trevin; 17.10.2011