Asp.net mvc ASP.NET MVC-能够处理阵列的自定义模型绑定器

Asp.net mvc ASP.NET MVC-能够处理阵列的自定义模型绑定器,asp.net-mvc,arrays,modelbinders,imodelbinder,custom-model-binder,Asp.net Mvc,Arrays,Modelbinders,Imodelbinder,Custom Model Binder,我需要实现允许用户以任何形式输入价格的功能,即允许10美元、10美元、10美元,。。。作为输入 我想通过实现Price类的定制模型绑定器来解决这个问题 class Price { decimal Value; int ID; } 表单包含一个数组或一个价格作为键 keys: "Prices[0].Value" "Prices[0].ID" "Prices[1].Value" "Prices[1].ID" ... ViewModel包含一个Prices属性: public List<

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

我想通过实现Price类的定制模型绑定器来解决这个问题

 class Price { decimal Value; int ID; } 
表单包含一个数组或一个价格作为键

keys:
"Prices[0].Value"
"Prices[0].ID"
"Prices[1].Value"
"Prices[1].ID"
...
ViewModel包含一个Prices属性:

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

如何实现正确处理数组的自定义模型绑定器?

明白了:关键是不要尝试绑定单个价格实例,而是为
列表
类型实现模型绑定器:

    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();
公共对象绑定模型(ControllerContext ControllerContext,ModelBindingContext bindingContext) { List res=新列表(); var form=controllerContext.HttpContext.Request.form; int i=0; 而(!string.IsNullOrEmpty(形式为[“价格[”+i+“].PricingTypeID])) { var p=新价格(); p、 价值=过程(形式[“价格[”+i+“].价值]); p、 PricingTypeID=int.Parse(格式[“价格[”+i+“].PricingTypeID]); 决议增补(p); i++; } 返回res; } //登记入册 Binders[typeof(List)]=新价格ModelBinder();
我是否正确地猜测ID是用户ID而不是货币ID?这是定价类型的ID,与本问题无关无需使用多种货币-我们固定使用单一货币,但需要允许问题中提到的各种输入格式也可以查看:
    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();