2011-12-05 4 views
12

RouteValueDicitonaryまたは匿名オブジェクトを@ Url.Actionメソッド(またはその類似物)に渡すとき、コレクションオブジェクトを適切に渡す方法がありますまたはIEnumerableのように、デフォルトのモデルバインダーと互換性のあるURLを生成しますか?例えば配列をRouteValuesに渡して、モデルのバインダーフレンドリーなURLをレンダリングします

、私はこのようなアクション持って言う:

public ActionResult Index(ICollection<int> ids) 
    { 
    ...do something 
    } 

を、私のテンプレートで、私はこのような何か:

@Url.Action("Index", routeValues:new int[]{1,2,3}) 

目標は、このようなURLの出力を持つことです。

... /index?ids=1&ids=2&ids=3 

が、URLの出力は、実際にこのようなものです:

... /index?ids=System.Int[] 

私は現在これについてのサポートはないと仮定しています。そうでない場合は、MVCのどの部分でカスタムハンドラを作成する必要がありますか、このデフォルト機能をオーバーライドする必要はありますか?

答えて

11

残念ながら現在、このようなURLを生成するための既存のヘルパーはありません。だから、一つの可能​​性は、手動でそれを行うことです。

@(Url.Action("Index") + "?" + string.Join("&", new int[] { 1, 2, 3 }.Select(x => "ids=" + x))) 

やロジックをカプセル化するための拡張メソッドを記述します。

@Url.ActionWithIds("Index", new int[] { 1, 2, 3 }) 

たものが整数であるので、我々は、URLエンコードを必要としませんが、あなたがしたい場合は文字列のコレクションと同じものは、値が適切にURLエンコードされる必要があります。使用する場合

+0

現在の日はどうなっていますか?ヘルパーには何らかのビルドがありますか? – MDDDC

1

デフォルトのモデルバインダー、あなたのようなもので終わる必要があります。

?ids=1&ids=2&ids=3 

のことができます。でも、ドキュメントHttpValueCollectionという名前のプライベートコレクションを返すことがParseQueryStringユーティリティを使用してNameValueCollectionのだと言います。 次に、キーを手動で追加します.HttpValueCollectionがエンコードを行います。 そしてちょうど手動のQueryStringを追加します。

var qs = HttpUtility.ParseQueryString(""); 
new List<int> { 1, 2, 3, 4, 5 }.ForEach(x => qs.Add("ids", x.ToString())); 

@Url.Action("Index")[email protected] 
2

パス往復の目的のためにモデルバインディング構文を使用してRouteValueDictionaryへの配列の各要素。

int i = 0; 
var temprvd = arr.ToDictionary(m => String.Format("name[{0}]", i++), m => (object) m); 
@Url.Action("index", new RouteValueDictionary(temprvd)); 

または既存のルート値辞書と連結してください。

正しいRouteValueDictionaryコンストラクタのオーバーロードが使用されるように、値をobjectにキャストします(前述)。

関連する問題