Почему ModelState.IsValid всегда возвращает false в mvc
В моем контроллере этот код:
[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 во время публикации страницы...
Ответы
Ответ 1
Пожалуйста, разместите свой класс моделей.
Чтобы проверить ошибки в состоянии модели, используйте следующий код
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
.
Ответ 2
Как говорит Брэд Уилсон в его ответе здесь:
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.
}
Если это поможет вам поймать ошибку. Предоставлено это и this
Ответ 3
"ModelState.IsValid" сообщает вам, что модель потребляется представлением (т.е. PaymentAdviceEntity) удовлетворяет всем типам проверки или не задана в свойствах модели DataAnotation.
В этом коде представление не связывает никаких свойств модели.
Поэтому, если вы помещаете какие-либо DataAnotations или валидацию в модель (то есть PaymentAdviceEntity). то проверки не удовлетворяют.
скажем, если какие-либо свойства в модели - это имя, которое требуется в модели. Тогда значение свойства остается пустым после публикации. Так что модель недействительна (т.е. ModelState.IsValid возвращает false).
Вам нужно удалить проверки уровня модели.