为什么在MVC中ModelState.IsValid总是返回false?

35

在我的控制器中,这段代码:

[HttpPost]
        public ActionResult Edit(Company company, FormCollection IsCostCenters)
        {
            if (ModelState.IsValid)
            {
                Company objNewCompany = new Company();
                //oParty.CostCenters.Clear();

                using (PaymentAdviceEntityContainer db1 = new PaymentAdviceEntityContainer())
                {
                    objNewCompany = db1.Companies.Find(company.Id);

                    objNewCompany.CostCenters.Clear();

                    string[] temp = IsCostCenters["CostCenters"].Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                    foreach (var s in temp)
                    {
                        if (s != "false")
                        {

                            CostCenter oCostCenter = new CostCenter();
                            oCostCenter = db1.CostCenters.Find(Convert.ToInt32(s));
                            objNewCompany.CostCenters.Add(oCostCenter);
                        }
                    }
                    db1.SaveChanges();
                }

                db.Entry(company).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            ViewBag.CreatedById = new SelectList(db.Employees, "Id", "FirstName", company.CreatedById);
            return View(company);
        }

以下是我的代码:

@using PaymentAdviceEntity;
@{

    ViewBag.Title = "Edit";
    List<CostCenter> clist = new List<CostCenter>();
    clist = ((List<CostCenter>)ViewBag.CostCenters).ToList();
}



                       <div style="line-height: 22px; width: 100%;height :3%; float: left; ">
                       @{
    foreach (var item in clist)
    {                      
                             <div  style="line-height: 22px; width: 28%; float: left;">
                                                <span class="checkbox">@Html.CheckBox("CostCenters", item.IsChecked, new { @value = item.Id })</span>
                                               <span>@Html.DisplayFor(modelItem => item.Name)</span>

                              </div> 

    }
}

所以请问在页面提交时为什么ModelState.IsValid会返回false?


请参见此链接:https://dev59.com/IXRB5IYBdhLWcg3wN1EQ - Iswanto San
参数转换从类型'System.String'到类型'PaymentAdviceEntity.CostCenter'失败,因为没有类型转换器可以在这些类型之间进行转换。如何解决此错误,请告诉我。 - Sraj Mane
3个回答

143

请发布您的模型类。

要检查ModelState中的错误,请使用以下代码:

var errors = ModelState
    .Where(x => x.Value.Errors.Count > 0)
    .Select(x => new { x.Key, x.Value.Errors })
    .ToArray();

或者:您也可以使用

var errors = ModelState.Values.SelectMany(v => v.Errors);

在上面的那一行设置一个断点,查看你的ModelState中有哪些错误。


发布错误信息 - Karthik Chintala
你在哪里收到那个错误信息? - Karthik Chintala
4
由于您的答案,我能够调试我的应用程序。 - Nolonar
1
完美的建议。谢谢。 - Dan Randolph
这是现在我的第一个(也是永久的)观察:ModelState.Where(x => x.Value.Errors.Count > 0).Select(x => new { x.Key, x.Value.Errors }).ToArray(); - MEC
显示剩余4条评论

13

正如Brad Wilson在这里的回答中所说:

ModelState.IsValid可以告诉您是否向ModelState添加了任何模型错误。

默认的模型绑定器将为基本类型转换问题(例如对于“int”传递非数字)添加一些错误。您可以根据您所使用的任何验证系统更充分地填充ModelState。

尝试使用:-

if (!ModelState.IsValid)
{
    var errors = ModelState.SelectMany(x => x.Value.Errors.Select(z => z.Exception));

    // Breakpoint, Log or examine the list with Exceptions.
}

如果它有助于捕获错误。 因为这个这个


1
当你复制别人的文字时,必须明确引用并归属该措辞。我已经编辑了这个答案来做到这一点,但是你将来必须自己做到这一点。 - Brad Larson
2
@BradLarson,首先对没有礼貌的部分表示歉意。我一直尝试着始终保持礼貌,就像我在结尾处所写的那样。如果我错过了链接到Brad Wilson的回答,那是我的错误。请原谅! - Shubh

4

"ModelState.IsValid"可以告诉你视图(即PaymentAdviceEntity)所使用的数据模型是否满足所有数据验证要求或者在数据模型中的属性上是否指定了DataAnnotation。

在这段代码中,视图没有绑定任何数据模型属性。 因此,如果在数据模型(即PaymentAdviceEntity)中设置了任何DataAnnotation或数据验证规则,则这些规则将无法得到满足。 例如,如果在数据模型中有一个Name属性,并且该属性被设置为必填项,则提交时该属性的值为空白。因此,数据模型不符合要求(即ModelState.IsValid返回false)。 您需要删除数据模型级别的验证规则。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接