Подтвердить что ты не робот

Получить сообщение об ошибке, если ModelState.IsValid не удается?

У меня есть эта функция в моем контроллере.

[HttpPost]
public ActionResult Edit(EmployeesViewModel viewModel)
{
    Employee employee = GetEmployee(viewModel.EmployeeId);
    TryUpdateModel(employee);

    if (ModelState.IsValid)
    {
        SaveEmployee(employee);
        TempData["message"] = "Employee has been saved.";
        return RedirectToAction("Details", new { id = employee.EmployeeID });
    }

    return View(viewModel); // validation error, so redisplay same view
}

Он продолжает терпеть неудачу, ModelState.IsValid продолжает возвращать false и перерисовывать представление. Но я понятия не имею, что это за ошибка.

Есть ли способ получить ошибку и повторно отобразить ее пользователю?

4b9b3361

Ответ 1

Вы можете сделать это в своем представлении, не делая ничего особенного в своем действии, используя Html.ValidationSummary(), чтобы показать все сообщения об ошибках, или Html.ValidationMessageFor(), чтобы показать сообщение для определенного свойства модели.

Если вам все еще нужно видеть ошибки внутри вашего действия или контроллера, см. ModelState.Errors свойство

Ответ 2

Попробуй это

if (ModelState.IsValid)
{
    //go on as normal
}
else
{
    var errors = ModelState.Select(x => x.Value.Errors)
                           .Where(y=>y.Count>0)
                           .ToList();
}

ошибки будут список всех ошибок.

Если вы хотите отобразить ошибки для пользователя, все, что вам нужно сделать, это вернуть модель в представление, и если вы не удалили выражения Razor @Html.ValidationFor(), она отобразится.

if (ModelState.IsValid)
{
    //go on as normal
}
else
{
    return View(model);
}

Представление будет отображать любые ошибки проверки рядом с каждым полем и/или в ValidationSummary, если оно присутствует.

Ответ 3

Если вы хотите создать одну строку сообщения об ошибке, содержащую сообщения об ошибках ModelState, вы можете использовать SelectMany, чтобы сгладить ошибки в один список:

if (!ModelState.IsValid)
{
    var message = string.Join(" | ", ModelState.Values
        .SelectMany(v => v.Errors)
        .Select(e => e.ErrorMessage));
    return new HttpStatusCodeResult(HttpStatusCode.BadRequest, message);
}

Ответ 4

Если Модальное состояние не является допустимым, и ошибка не отображается на экране, потому что ваш элемент управления находится в свернутом аккордеоне, тогда вы можете вернуть HttpStatusCode, чтобы отображалось фактическое сообщение об ошибке, если вы делаете F12. Также вы можете зарегистрировать эту ошибку в журнале ошибок ELMAH. Ниже приведен код

if (!ModelState.IsValid)
{
              var message = string.Join(" | ", ModelState.Values
                                            .SelectMany(v => v.Errors)
                                            .Select(e => e.ErrorMessage));

                //Log This exception to ELMAH:
                Exception exception = new Exception(message.ToString());
                Elmah.ErrorSignal.FromCurrentContext().Raise(exception);

                //Return Status Code:
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest, message);
}

Но учтите, что этот код будет регистрировать все ошибки проверки. Поэтому это следует использовать только тогда, когда возникает такая ситуация, когда вы не видите ошибки на экране.

Ответ 5

Если кто-то здесь для WebApi (не MVC), вы просто возвращаете объект ModelState:

return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);

Ответ 6

Я понятия не имею, если это ваша проблема, но если вы добавите пользователя и затем измените имя своего приложения, этот пользователь останется в базе данных (конечно), но будет недействительным (что является правильным поведением), Однако для этого типа сбоя не будет добавлена ​​ошибка. Список ошибок пуст, но ModelState.IsValid вернет false для входа.

Ответ 7

Ок Проверить и Добавить:

  • Сделайте контрольную точку на своей строке ModelState в коде
  • Добавьте свое состояние модели в свои часы
  • Развернуть ModelState "Значения"
  • Развернуть значения "Результаты"

Теперь вы можете увидеть список всех SubKey с его состоянием проверки в конце значения.

Ищите недопустимое значение.

Ответ 8

Это расширение образца

public class GetModelErrors
{
    //Usage return Json to View :
    //return Json(new { state = false, message = new GetModelErrors(ModelState).MessagesWithKeys() });
    public class KeyMessages
    {
        public string Key { get; set; }
        public string Message { get; set; }
    }
    private readonly ModelStateDictionary _entry;
    public GetModelErrors(ModelStateDictionary entry)
    {
        _entry = entry;
    }

    public int Count()
    {
        return _entry.ErrorCount;
    }
    public string Exceptions(string sp = "\n")
    {
        return string.Join(sp, _entry.Values
            .SelectMany(v => v.Errors)
            .Select(e => e.Exception));
    }
    public string Messages(string sp = "\n")
    {
        string msg = string.Empty;
        foreach (var item in _entry)
        {
            if (item.Value.ValidationState == ModelValidationState.Invalid)
            {
                msg += string.Join(sp, string.Join(",", item.Value.Errors.Select(i => i.ErrorMessage)));
            }
        }
        return msg;
    }

    public List<KeyMessages> MessagesWithKeys(string sp = "<p> ● ")
    {
        List<KeyMessages> list = new List<KeyMessages>();
        foreach (var item in _entry)
        {
            if (item.Value.ValidationState == ModelValidationState.Invalid)
            {
                list.Add(new KeyMessages
                {
                    Key = item.Key,
                    Message = string.Join(null, item.Value.Errors.Select(i => sp + i.ErrorMessage))
                });
            }
        }
        return list;
    }
}

Ответ 9

Пытаться

ModelState.Values.First().Errors[0].ErrorMessage

Ответ 10

ModelState.Values.SelectMany(v => v.Errors).ToList().ForEach(x => _logger.Error($"{x.ErrorMessage}\n"));