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

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

7   51   2011-03-06 20:50:56

7 ответов:

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

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

попробуй такое

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

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

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

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

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

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

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

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

Ok проверить и добавить смотреть:

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

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

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