我想在包含对象列表的表单上进行复杂验证。
我的表单包含一个列表,比方说,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();
任何帮助表示感谢。
答案 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")
价格值。