2012-02-15 7 views
14

でRouteValueDictionaryを作成します。私は、次のようなURLにユーザーを送信RedirectToRouteResultを返すようにしたいと思います。多値キー

私の呼び出しは次のようになります。私はこれまで試してみました何であり、それは動作しません。ここreturn RedirectToAction(string.Empty, routeValues);

// ...?newid%5B0%5D=3&newid%5B1%5D=5&newid%5B2%5D=7 
var routeValues = new RouteValueDictionary { 
    {"id", myid}, 
    {"newid[0]", 3}, 
    {"newid[1]", 5}, 
    {"newid[2]", 7}, 
}; 

// ...?newid=System.Int32%5B%5D 
var routeValues = new { id = myid, newid = new int[] { 3, 5, 7 } }; 

// ...?newid=System.String%5B%5D 
var routeValues = new { id = myid, newid = new string[] { "3", "5", "7" } }; 

// ...?newid=System.Int32%5B%5D 
var routeValues = new RouteValueDictionary { 
    {"id", myid}, 
    {"newid", new int[] { 3, 5, 7 } } 
}; 

この作品を作るための秘訣は何ですか?

答えて

13

これはフレームワークから実際に欠けているものです。あなたの最善の策は手動でロールすることです:

public ActionResult Foo() 
{ 
    var ids = new[] { 3, 5, 7 }; 
    var url = new UriBuilder(Url.Action("MyAction", "MyController", new { id = "123" }, Request.Url.Scheme)); 
    url.Query = string.Join("&", ids.Select(x => "newid=" + HttpUtility.UrlEncode(x.ToString()))); 
    return Redirect(url.ToString()); 
} 

これをカスタム拡張メソッドに入れると、もちろん可読性が向上する可能性があります。

+0

+1エレガントなソリューション、Darin。 –

+0

ありがとう - 素晴らしい作品! (テストを少し難しくする - コントローラのContextとUrlHelperをモックする必要があるが、それはちょうどその通りだと思う) –

0

私は、複数回提供されるキーの名前がわからない場合もありました。そしてクエリー・ストリングは複数のキーを昏睡区切りのリストとして受け入れます。 Darinの答えに基づいて拡張メソッドを書くことが役に立ちました。

public static UriBuilder TransformToMultiplyKeyUrl(this RouteValueDictionary self, string baseUrl) 
    { 
     var url = new UriBuilder(baseUrl); 
     //Transform x=y,z into x=y&x=z 
     url.Query = String.Join("&", 
      self.SelectMany(
       pair => ((string)pair.Value).Split(',') 
        .Select(v => String.Format("{0}={1}", pair.Key, HttpUtility.UrlEncode(v))))); 
     return url; 
    }