1. ホーム
  2. c#

[解決済み] ASP.NET MVCコントローラのアクションパラメータとして配列を受け取るには?

2023-04-08 05:37:04

質問

ASP.net の MVC コントローラである Designs というコントローラがあり、次のようなシグネチャを持つアクションがあります。

public ActionResult Multiple(int[] ids)

しかし、urlを使用してこのアクションに移動しようとしたとき。

http://localhost:54119/Designs/Multiple?ids=24041,24117

ids パラメータは常に null です。MVC で ?ids= URLクエリパラメータをアクションの配列に変換するMVCを取得する方法はありますか?私はアクションフィルタを使用する話を見たことがありますが、私の知る限り、それは配列がURL自体ではなく、リクエストデータで渡されるPOSTに対してのみ機能します。

どのように解決するのですか?

デフォルトのモデルバインダーはこのURLを想定しています。

http://localhost:54119/Designs/Multiple?ids=24041&ids=24117

へのバインドを成功させるために

public ActionResult Multiple(int[] ids)
{
    ...
}

また、これをカンマ区切りの値で動作させたい場合は、カスタムモデルバインダーを書けばよいでしょう。

public class IntArrayModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (value == null || string.IsNullOrEmpty(value.AttemptedValue))
        {
            return null;
        }

        return value
            .AttemptedValue
            .Split(',')
            .Select(int.Parse)
            .ToArray();
    }
}

で、このモデルバインダーを特定のアクションの引数に適用することができます。

public ActionResult Multiple([ModelBinder(typeof(IntArrayModelBinder))] int[] ids)
{
    ...
}

のすべての整数配列のパラメータに適用することもできます。 Application_StartGlobal.asax :

ModelBinders.Binders.Add(typeof(int[]), new IntArrayModelBinder());

で、コントローラアクションは次のようになります。

public ActionResult Multiple(int[] ids)
{
    ...
}