7

我需要实现一个功能,允许用户以任何形式输入价格,即允许10美元,10美元,10美元...作为输入。ASP.NET MVC - 自定义模型绑定器能够处理阵列

我想通过为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美元”这样的输入。

我迄今价格类型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; 
} 

如何实现正确处理的数组中的自定义模型活页夹?

+0

难道我猜对了那个ID是用户ID和不是ID货币? – AxelEckenberger

+0

这是定价类型的编号,与此问题无关 – Marek

+0

不需要多种货币 - 我们固定为单一货币,但需要允许各种输入格式,如问题 – Marek

回答

16

明白了:问题的关键是不要尝试结合单一价格实例,而是实现ModelBinder的用于List<Price>类型:

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();