ASP.NET MVC - 自定义模型绑定器能够处理数组

8

我需要实现一个功能,允许用户以任何形式输入价格,例如:10 USD、10$、$10等。

我想通过为Price类实现自定义模型绑定器来解决这个问题。

 class Price { decimal Value; int ID; } 

表单包含一个价格数组作为键。
keys:
"Prices[0].Value"
"Prices[0].ID"
"Prices[1].Value"
"Prices[1].ID"
...

视图模型包含一个价格属性:
public List<Price> Prices { get; set; }

默认的模型绑定器在用户将一个可转换为十进制的字符串输入到值输入框时工作得很好。 我想要允许像“100美元”这样的输入。

迄今为止,我的价格类型的模型绑定器:

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;
}

我该如何实现一个自定义的模型绑定器以正确处理数组?

我猜测ID是用户ID而不是货币ID,我的猜测正确吗? - AxelEckenberger
那是定价类型的ID,与此问题无关。 - Marek
不需要多种货币 - 我们只使用一种货币,但需要允许各种输入格式,如问题中所述。 - Marek
请查看以下内容:http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx - Martin
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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接