1

単一の非表示の入力フィールドを使用して整数のリストを格納するサード パーティ コントロールがあります。このコントロールは、サイト全体のさまざまなフォームで使用されています。

送信された値 (Fiddler に表示される) は次のとおりです。

items=1,35,346,547

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

public ActionResults SomeAction(IEnumerable<int> items) {...}

予想どおり、DefaultModelBinder は整数のリストを解析できません。入力値の形式を変更する機能があることを考えると、デフォルトのモデル バインダーがこれを解析できるようにする形式はありますか?

アクションを簡単に変更して、文字列パラメーターを持ち、解析を自分で処理することもできますが、モデル バインダーにこれを実行してもらいたいと思います。フォームの送信を傍受し、データ/データ型を JSON (または他の形式) にスクレイプ/変更することもできますが、このアプローチは避けたいと思います。もう 1 つのオプションは、カスタム モデル バインダーを作成することですが、これは少しやり過ぎのように思えます。

おすすめは?

4

1 に答える 1

2

説明

いいえ、Default Model Binder はこれを行うことができません。それを処理するカスタム モデル バインダーを作成できます。入力フィールド名がitems私のサンプルであると仮定すると、正しい名前に変更されていない場合でも機能するはずです。

サンプル

public class MyCustomModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        List<int> result = new List<int>();

        var value = bindingContext.ValueProvider.GetValue("items").AttemptedValue;

        foreach (string i in value.Split(",".ToCharArray()))
        {
            int a;
            if (Int32.TryParse(i, out a))
                result.Add(a);
        }
        
        return result;
    }
}

public ActionResult SomeAction([ModelBinder(typeof(MyCustomModelBinder))] List<int> list)

詳しくは

アップデート

カスタム モデル バインダーを登録できます。global.asax

  ModelBinders.Binders.Add(typeof(List<int>), new MyCustomModelBinder());

List<int>ただし、アクション メソッドにある場合、これは常にバインドしようとすることに注意してください。

あなたのコメントによると: 現時点では、Default Model Binder がプロパティをバインドしようとしていて、バインドするタイミングとバインドしないタイミングがわからないため、それを行う方法はありませList<int>ん。

ここのソースを見ることができますDefaultModelBinder

于 2011-12-23T21:15:26.693 に答える