MVC复杂模型绑定

时间:2009-11-08 11:24:44

标签: asp.net-mvc binding validation

我想在包含对象列表的表单上进行复杂验证。

我的表单包含一个列表,比方说,MyObjects。 MyObject由double amount和MyDate组成,它只是DateTime的包装。

public class MyObject
{
    public MyDate Date { get; set; } //MyDate is wrapper around DateTime
    public double Price { get; set; }
}

表格......

<input type="text" name="myList[0].Date" value="05/11/2009" />
<input type="text" name="myList[0].Price" value="100,000,000" />

<input type="text" name="myList[1].Date" value="05/11/2009" />
<input type="text" name="myList[1].Price" value="2.23" />

这是我的行动

public ActionResult Index(IList<MyObject> myList)
{
   //stuff
}

我想允许用户输入100,000,000的价格和自定义模型绑定器来删除','因此它可以转换为double。同样,我需要将05/11/2009转换为MyDate对象。我想过创建一个MyObjectModelBinder,但不知道该怎么做。

ModelBinders.Binders[typeof(MyObject)] = new MyObjectModelBinder();

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:2)

以下是自定义模型绑定器的示例实现:

public class MyObjectModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        // call the base method and let it bind whatever properties it can
        var myObject = (MyObject)base.BindModel(controllerContext, bindingContext);
        var prefix = bindingContext.ModelName;
        if (bindingContext.ValueProvider.ContainsKey(prefix + ".Price"))
        {
            string priceStr = bindingContext.ValueProvider[prefix + ".Price"].AttemptedValue;
            // priceStr = 100,000,000 or whatever the user entered
            // TODO: Perform transformations on priceStr so that parsing works
            // Note: Be carefull with cultures
            double price;
            if (double.TryParse(priceStr, out price))
            {
                myObject.Price = price;
            }
        }

        if (bindingContext.ValueProvider.ContainsKey(prefix + ".Date"))
        {
            string dateStr = bindingContext.ValueProvider[prefix + ".Date"].AttemptedValue;
            myObject.Date = new MyDate();
            // TODO: Perform transformations on dateStr and set the values 
            // of myObject.Date properties
        }

        return myObject;
    }
}

答案 1 :(得分:0)

你肯定会走正确的道路。当我这样做时,我制作了一个中间视图模型,将Price作为字符串,因为逗号。然后我从视图模型(或演示模型)转换为控制器模型。控制器模型有一个非常简单的构造函数,它接受了一个视图模型,可以Convert.ToDecimal("12,345,678.90")价格值。