如何在视图中获取错误集合?
我不想使用Html Helper验证摘要或验证消息。相反,我想检查错误,如果有任何显示特定格式。另外在输入控件上我想检查特定的属性错误并在输入中添加一个类。
P.S。我正在使用Spark View引擎,但想法应该是一样的。
所以我想我可以做点像......
<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类。
答案 0 :(得分:207)
<% ViewData.ModelState.IsValid %>
或
<% ViewData.ModelState.Values.Any(x => x.Errors.Count >= 1) %>
和特定财产......
<% ViewData.ModelState["Property"].Errors %> // Note this returns a collection
答案 1 :(得分:59)
要从ModelState中获取错误,请使用此Linq:
var modelStateErrors = this.ModelState.Keys.SelectMany(key => this.ModelState[key].Errors);
答案 2 :(得分:29)
var modelStateErrors = this.ModelState.Values.SelectMany(m => m.Errors);
答案 3 :(得分:25)
这将为您提供一个字符串,其中包含逗号分隔的所有错误
string validationErrors = string.Join(",",
ModelState.Values.Where(E => E.Errors.Count > 0)
.SelectMany(E => E.Errors)
.Select(E => E.ErrorMessage)
.ToArray());
答案 4 :(得分:6)
谢谢乍得!为了显示与密钥相关的所有错误,这是我想出的。由于某种原因,基本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();
}
答案 5 :(得分:4)
从上面汇总了几个答案,这就是我最终使用的内容:
var validationErrors = ModelState.Values.Where(E => E.Errors.Count > 0)
.SelectMany(E => E.Errors)
.Select(E => E.ErrorMessage)
.ToList();
validationErrors
最终成为包含每条错误消息的List<string>
。从那里开始,使用该列表很容易做到你想做的事。
答案 6 :(得分:2)
这是VB。
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())
答案 7 :(得分:0)
如果您不知道哪个属性导致了错误,您可以使用反射循环遍历所有属性:
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”的类型。
答案 8 :(得分:0)
从对我有用的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+the+Key+value+of+the+Model+error