41

配列 (string[]) を返すメソッドがあり、この文字列の配列をアクション リンクに渡して、次のようなクエリ文字列を作成しようとしています。

/Controller/Action?str=val1&str=val2&str=val3...etc

しかし、 new { str = GetStringArray() } を渡すと、次の URL を取得します。

/Controller/Action?str=System.String%5B%5D

したがって、基本的には、string[] を取得し、値を取得するために .ToString() を実行しています。

何か案は?ありがとう!

4

6 に答える 6

14

値を保持する RouteValueDictionary を作成してみてください。各エントリに異なるキーを与える必要があります。

<%  var rv = new RouteValueDictionary();
    var strings = GetStringArray();
    for (int i = 0; i < strings.Length; ++i)
    {
        rv["str[" + i + "]"] = strings[i];
    }
 %>

<%= Html.ActionLink( "Link", "Action", "Controller", rv, null ) %>

のようなリンクが表示されます

<a href='/Controller/Action?str=val0&str=val1&...'>Link</a>

編集: MVC2 は ValueProvider インターフェイスを変更して、元の回答を廃止しました。プロパティとして文字列の配列を持つモデルを使用する必要があります。

public class Model
{
    public string Str[] { get; set; }
}

次に、モデル バインダーは、URL で渡した値をモデルに取り込みます。

public ActionResult Action( Model model )
{
    var str0 = model.Str[0];
}
于 2009-04-04T20:14:08.200 に答える
4

これには本当に腹が立ったので、Scott Hanselman からインスピレーションを得て、次の (流暢な) 拡張メソッドを作成しました。

public static RedirectToRouteResult WithRouteValue(
    this RedirectToRouteResult result, 
    string key, 
    object value)
{
    if (value == null)
        throw new ArgumentException("value cannot be null");

    result.RouteValues.Add(key, value);

    return result;
}

public static RedirectToRouteResult WithRouteValue<T>(
    this RedirectToRouteResult result, 
    string key, 
    IEnumerable<T> values)
{
    if (result.RouteValues.Keys.Any(k => k.StartsWith(key + "[")))
        throw new ArgumentException("Key already exists in collection");

    if (values == null)
        throw new ArgumentNullException("values cannot be null");

    var valuesList = values.ToList();

    for (int i = 0; i < valuesList.Count; i++)
    {
        result.RouteValues.Add(String.Format("{0}[{1}]", key, i), valuesList[i]);
    }

    return result;
}

次のように呼び出します。

return this.RedirectToAction("Index", "Home")
           .WithRouteValue("id", 1)
           .WithRouteValue("list", new[] { 1, 2, 3 });
于 2014-02-14T17:21:53.137 に答える
1

Unbinderというライブラリがあり、これを使用して複雑なオブジェクトをルート/URL に挿入できます。

それはこのように動作します:

using Unbound;

Unbinder u = new Unbinder();
string url = Url.RouteUrl("routeName", new RouteValueDictionary(u.Unbind(YourComplexObject)));
于 2014-05-23T08:56:12.440 に答える
-7

配列には POST を使用します。見苦しくて GET を悪用するだけでなく、URL スペースが不足するリスクがあります (信じられないかもしれませんが)。

2000 バイトの制限があると仮定します。クエリ文字列のオーバーヘッド (&str=) により、実際のデータは最大 300 バイトに削減されます (残りの URL が 0 バイトであると仮定)。

于 2009-04-04T20:07:37.840 に答える