Получить сообщение об ошибке, если ModelState.IsValid не удается? - PullRequest
63 голосов
/ 06 марта 2011

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

[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 и снова отображать вид. Но я понятия не имею, в чем ошибка.

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

Ответы [ 10 ]

123 голосов
/ 20 декабря 2012

Попробуйте это

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

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

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

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

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

71 голосов
/ 12 июня 2014

Если вы хотите сгенерировать единственную строку сообщения об ошибке, содержащую 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);
}
32 голосов
/ 06 марта 2011

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

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

5 голосов
/ 25 февраля 2016

Если модальное состояние не является действительным и ошибка не видна на экране, потому что ваш элемент управления находится в свернутом аккордеоне, вы можете вернуть 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);
}

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

1 голос
/ 14 февраля 2019

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

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

1 голос
/ 03 сентября 2018

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

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;
    }
}
0 голосов
/ 06 июня 2019
ModelState.Values.SelectMany(v => v.Errors).ToList().ForEach(x => _logger.Error($"{x.ErrorMessage}\n"));
0 голосов
/ 13 февраля 2019

Попробуйте

ModelState.Values.First().Errors[0].ErrorMessage
0 голосов
/ 29 апреля 2017

ОК. Проверьте и добавьте к просмотру:

  1. Сделать точку останова на вашей строке ModelState в вашем коде
  2. Добавьте состояние вашей модели в часы
  3. Развернуть ModelState "Значения"
  4. Развернуть значения «Просмотр результатов»

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

Поэтому найдите Недопустимое значение .

0 голосов
/ 21 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...