Как получить коллекцию ошибок состояния модели в ASP.NET MVC?
Как получить коллекцию ошибок в представлении?
Я не хочу использовать Html Helper Validation Summary или Validation Message. Вместо этого я хочу проверить наличие ошибок и, если они есть, отобразить их в определенном формате. Также на элементах управления вводом я хочу проверить наличие определенной ошибки свойства и добавить класс к входу.
PS Я использую Spark View Engine, но идея должна быть такой же.
Поэтому я решил, что могу сделать что-то вроде...
<if condition="${ModelState.Errors.Count > 0}">
DispalyErrorSummary()
</if>
....and also...
<input type="text" value="${Model.Name}"
class="?{ModelState.Errors["Name"] != string.empty} error" />
....
Или что-то типа того.
ОБНОВИТЬ
Мое окончательное решение выглядело так:
<input type="text" value="${ViewData.Model.Name}"
class="text error?{!ViewData.ModelState.IsValid &&
ViewData.ModelState["Name"].Errors.Count() > 0}"
id="Name" name="Name" />
Это только добавляет класс css error, если это свойство имеет ошибку.
8 ответов
<% ViewData.ModelState.IsValid %>
или же
<% ViewData.ModelState.Values.Any(x => x.Errors.Count >= 1) %>
и для конкретной собственности...
<% ViewData.ModelState["Property"].Errors %> // Note this returns a collection
Чтобы просто получить ошибки от ModelState, используйте этот Linq:
var modelStateErrors = this.ModelState.Keys.SelectMany(key => this.ModelState[key].Errors);
Сокращенная версия ответа @ChrisMcKenzie:
var modelStateErrors = this.ModelState.Values.SelectMany(m => m.Errors);
Это даст вам одну строку со всеми ошибками с разделением запятой
string validationErrors = string.Join(",",
ModelState.Values.Where(E => E.Errors.Count > 0)
.SelectMany(E => E.Errors)
.Select(E => E.ErrorMessage)
.ToArray());
Собрав несколько ответов сверху, вот что я в итоге использовал:
var validationErrors = ModelState.Values.Where(E => E.Errors.Count > 0)
.SelectMany(E => E.Errors)
.Select(E => E.ErrorMessage)
.ToList();
validationErrors
в конечном итоге быть List<string>
который содержит каждое сообщение об ошибке. Оттуда легко сделать то, что вы хотите с этим списком.
Спасибо Чад! Чтобы показать все ошибки, связанные с ключом, вот что я придумал. По какой-то причине базовый помощник Html.ValidationMessage показывает только первую ошибку, связанную с ключом.
<%= Html.ShowAllErrors(mykey) %>
HtmlHelper:
public static String ShowAllErrors(this HtmlHelper helper, String key) {
StringBuilder sb = new StringBuilder();
if (helper.ViewData.ModelState[key] != null) {
foreach (var e in helper.ViewData.ModelState[key].Errors) {
TagBuilder div = new TagBuilder("div");
div.MergeAttribute("class", "field-validation-error");
div.SetInnerText(e.ErrorMessage);
sb.Append(div.ToString());
}
}
return sb.ToString();
}
Вот это В.Б.
Dim validationErrors As String = String.Join(",", ModelState.Values.Where(Function(E) E.Errors.Count > 0).SelectMany(Function(E) E.Errors).[Select](Function(E) E.ErrorMessage).ToArray())
Получил это из ответа BrockAllen, который сработал для меня, он отображает ключи с ошибками:
var errors =
from item in ModelState
where item.Value.Errors.Count > 0
select item.Key;
var keys = errors.ToArray();
Источник: https://forums.asp.net/t/1805163.aspx?Get%20the%20Key%20value%20of%20the%20Model%20error
Если вы не знаете, какое свойство вызвало ошибку, вы можете, используя отражение, перебрать все свойства:
public static String ShowAllErrors<T>(this HtmlHelper helper) {
StringBuilder sb = new StringBuilder();
Type myType = typeof(T);
PropertyInfo[] propInfo = myType.GetProperties();
foreach (PropertyInfo prop in propInfo) {
foreach (var e in helper.ViewData.ModelState[prop.Name].Errors) {
TagBuilder div = new TagBuilder("div");
div.MergeAttribute("class", "field-validation-error");
div.SetInnerText(e.ErrorMessage);
sb.Append(div.ToString());
}
}
return sb.ToString();
}
Где T - это тип вашей "ViewModel".