FormCollection System.Web.Mvc.ModelErrorCollection

时间:2011-09-08 05:50:36

标签: asp.net-mvc-3

csharp newpie在这里,我有以下控制器操作处理强类型视图表单,一些值我从fromCollection手动处理,它们是空的然后我得到这个错误:

{ Key = carCount , Errors = System.Web.Mvc.ModelErrorCollection }

但是如果有传入值,例如“0”,“1”等然后很好!

[HttpPost]
        public ActionResult create(Trip trip, FormCollection collection)//Trip trip
        {

            trip.carCount = TryToParse(collection["carCount"]);//int
            trip.busCount = TryToParse(collection["busCount"]);//int
            trip.truckCoun = TryToParse(collection["truckCount"]);//int

            var errors = ModelState
            .Where(x => x.Value.Errors.Count > 0)
            .Select(x => new { x.Key, x.Value.Errors })
            .ToArray();
            foreach (var error in errors)
            {
                System.Diagnostics.Debug.WriteLine(error);
            }
            more code................

这是将字符串转换为int的方法,完全可以正常工作:

private int TryToParse(string value)
{
    if (value.Trim() == "" || value.Trim() == null) value = "0";
    int number;
    bool result = int.TryParse(value, out number);
    return number;
}

有什么想法? 感谢

1 个答案:

答案 0 :(得分:2)

在您的操作之前运行的默认模型绑定器会看到您将此Trip模型作为操作的参数,并尝试根据请求设置其属性。现在,因为如果Request包含空值,那么您已将这3个属性定义为整数,在绑定期间,默认模型绑定器当然无法将空强转换为整数并自动向ModelState添加错误。然后调用控制器肌动蛋白,你所做的只是重置这个trip对象的值,但当然是保留了添加到ModelState的错误,这就是你观察到的。

因此,解决这个问题的方法是编写自定义模型绑定器或使这些属性成为可以为零的整数:

public int? CarCount { get; set; }
public int? BusCount { get; set; }
public int? TruckCount { get; set; }

然后让你的行动看起来像这样:

public ActionResult Create(Trip trip)
{
    if (!ModelState.IsValid)
    {
         // there were errors => redisplay the view
         return View(trip);
    }

    // at this stage the model is valid => process it
    ...
}