17

しばらくこれを見ていて、自分が馬鹿だと感じているだけで、もっと注目したい..

完全な URL を生成する必要があります (例: http://www.domain.com/controller/action?a=1&b=2)。通常はUrl.Action、プロトコルを指定して問題なくこれを行うために使用します。

var url = Url.Action("Action", "Controller", new { a = 1, b = 2 }, "http");

RouteValueDictionaryこれらの匿名オブジェクトを非表示にするために、 を返すクラスをまとめ始めました。ただし、ヘルパーと一緒に動作させることはできません。

var x = Url.Action("Action", "Controller", new RouteValueDictionary(new { a = 1, b = 2 }), "http");
// "http://127.0.0.1/Controller/Action?Count=2&Keys=System.Collections.Generic.Dictionary%602%2BKeyCollection%5BSystem.String%2CSystem.Object%5D&Values=System.Collections.Generic.Dictionary%602%2BValueCollection%5BSystem.String%2CSystem.Object%5D",

var y = Url.Action("Action", "Controller", new { a = 1, b = 2 }, "http");
// "http://127.0.0.1/Controller/Action?a=1&b=2"

facepalmにつながるポインタは大歓迎です:)

アップデート:

X上記のサンプルでは、​​RouteValueDictionary がコードの別の場所で作成されているため、' ' 変数を正しく動作させる必要があることを明確にするのがおそらく最善です。RouteValueDictionary が正しいと仮定します。

これが匿名オブジェクトで機能する理由がわかりませんが、同じオブジェクトにラップされた同じオブジェクトが a でラップされているRouteValueDictionaryと、ヘルパーがびっくりします。

4

2 に答える 2

15

興味深いことに、あなたの特定の例は、RouteValueDictionary ではなく、プロパティとして「オブジェクト」を取るメソッド シグネチャと一致しているようです。そのため、RouteValueDictionary を正しくシリアル化するのではなく、型名を ToString() するだけです。

 var x = Url.Action("Index", "Home", new RouteValueDictionary(new { a = 1, b = 2 }), "http", string.Empty);

末尾の「string.Empty」に注意してください。

RouteValueDictionary を受け入れ、正しくシリアル化する別のオーバーロードをコードに使用させるには、これで十分です。

// http://localhost:55110/?a=1&b=2
于 2013-03-15T13:56:38.793 に答える
5

使用しているオーバーロードは、RouteValueDictionary. 何らかの理由でこれが問題を引き起こしています.ToString()と何か関係があるのでしょうか? a を受け入れるオーバーロードを使用するRouteValueDictionaryと、これが機能するはずです。

これをテストするには、hostName 引数を追加して、以下に示すオーバーロードを選択します。

正しいオーバーロード

編集

プロジェクトでこの拡張機能を使用して、必要なオーバーロードを Url.Action に追加できます。内部的には、リクエストからホスト名を解決して追加します。

public static string Action
    (this UrlHelper helper, string action, 
     string controller, RouteValueDictionary routeValues, string protocol)
{
     string hostName = helper.RequestContext.HttpContext.Request.Url.Host;
     return helper.Action(action, controller, routeValues, protocol, hostName);
}
于 2013-03-15T13:10:28.237 に答える