34

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

[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的原因是什么......

4

3 回答 3

139

请发布您的模型类。

要检查您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.

于 2013-03-11T08:37:08.117 回答
13

正如布拉德威尔逊在他的回答中所说:

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

如果它有助于发现错误。礼貌这个这个

于 2013-03-11T07:57:24.500 回答
4

“ModelState.IsValid”告诉您视图使用的模型(即PaymentAdviceEntity)满足所有类型的验证或DataAnotation 未在模型属性中指定。

在此代码中,视图不绑定任何模型属性。因此,如果您在模型中放置任何 DataAnnotations 或验证(即 PaymentAdviceEntity)。那么验证不满足。假设模型中的任何属性是模型中需要的名称。然后属性的值在发布后保持空白。因此模型无效(即 ModelState.IsValid 返回 false)。您需要删除模型级别的验证。

于 2013-03-11T08:42:02.837 回答