我需要执行一个功能,以允许用户在任何形式的输入价格,即,以允许10美元,10,$ 10,...作为输入。

我想通过实施价格类的自定义模型粘合剂来解决这一点。

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

如何实现一个自定义的模型绑定,处理正确的阵列?

有帮助吗?

解决方案

得到它:要点是不尝试结合单一价格实例,而是实现用于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();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top