【问题标题】:ASP.NET MVC - Custom model binder able to process arraysASP.NET MVC - 能够处理数组的自定义模型绑定器
【发布时间】:2010-03-19 21:34:17
【问题描述】:

我需要实现一个功能,允许用户以任何形式输入价格,即允许 10 美元、10 美元、10 美元……作为输入。

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

 class Price { decimal Value; int ID; } 

表单包含一个数组或价格作为键

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

ViewModel 包含 Price 属性:

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

只要用户在 Value 输入中输入可转换为十进制的字符串,默认的模型绑定器就可以很好地工作。 我想允许像“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?

【问题讨论】:

标签: asp.net-mvc arrays modelbinders imodelbinder custom-model-binder


【解决方案1】:

知道了:关键是不要尝试绑定单个 Price 实例,而是为 List&lt;Price&gt; 类型实现 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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    相关资源
    最近更新 更多