4

単純な質問のように思えますが、私はそれを自分で理解することはできません...

私はそのようなアクションリンクを持っています

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

これにより、次のような URL 文字列が生成されます

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

しかし、次のURLを取得できるように、プラス記号(UrlPathEncodedであると想定しています)を保持したいと思います

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

まだ Html.ActionLink を使用している間にこれを行う簡単な方法はありますか?

4

2 に答える 2

3

さらにグーグルで調べた後、この投稿の質問を言い換えました。その質問からの回答を使用して、以下に含める適切なルーティング拡張方法をまとめることができました。

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" }
        );
于 2010-05-25T21:56:53.837 に答える
0

プラス記号 (エンコード後) は、エンコード前のスペースを表します。

そのため、ポストバックsearch+twitterで「twitter を検索」になり、その効果を達成するには、最初に「twitter を検索」を使用するだけです。

Html.ActionLink( "テスト", "テスト", new { q = "ツイッターを検索" } )

次のURLを生成します

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

お役に立てれば。

于 2010-05-20T20:47:18.317 に答える