8

ユーザーが任意の形式で価格を入力できるようにする機能を実装する必要があります。つまり、入力として 10 米ドル、10 ドル、10 ドルなどを許可する必要があります。

Price クラスのカスタム モデル バインダーを実装することで、これを解決したいと考えています。

 class Price { decimal Value; int ID; } 

フォームには配列または Price がキーとして含まれています

keys:
"Prices[0].Value"
"Prices[0].ID"
"Prices[1].Value"
"Prices[1].ID"
...

ViewModel には Price プロパティが含まれています。

public List<Price> Prices { get; set; }

デフォルトのモデル バインダーは、ユーザーが 10 進数に変換可能な文字列を [値] 入力に入力する限り、うまく機能します。「100 USD」のような入力を許可したいと思います。

これまでの価格タイプの私のModelBinder:

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
    Price res = new Price();
    var form = controllerContext.HttpContext.Request.Form;
    string valueInput = ["Prices[0].Value"]; //how to determine which index I am processing?
    res.Value = ParseInput(valueInput) 

    return res;
}

配列を正しく処理するカスタム モデル Binder を実装するにはどうすればよいですか?

4

1 に答える 1

20

了解しました。ポイントは、単一の Price インスタンスをバインドしようとするのではなく、List<Price>タイプの ModelBinder を実装することです。

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        List<Price> res = new List<Price>();
        var form = controllerContext.HttpContext.Request.Form;
        int i = 0;
        while (!string.IsNullOrEmpty(form["Prices[" + i + "].PricingTypeID"]))
        {
            var p = new Price();
            p.Value = Process(form["Prices[" + i + "].Value"]);
            p.PricingTypeID = int.Parse(form["Prices[" + i + "].PricingTypeID"]);
            res.Add(p);
            i++;
        }

        return res;
    }

//register for List<Price>
ModelBinders.Binders[typeof(List<Price>)] = new PriceModelBinder();
于 2010-02-28T10:14:21.250 に答える