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によってモデルプロパティで指定されていないことを示します。

このコードでは、ビューはモデルのプロパティをバインドしません。したがって、DataAnotationsまたは検証をモデル(つまり、PaymentAdviceEntity)に配置した場合。その場合、検証は満たされません。モデル内のプロパティが、モデルで必須となるNameである場合は、プロパティの値は投稿後も空白のままになります。したがって、モデルは無効です(つまり、ModelState.IsValidはfalseを返します)。モデルレベルの検証を削除する必要があります。

于 2013-03-11T08:42:02.837 に答える