ビューでエラーのコレクションを取得するにはどうすればよいですか?
Html Helper Validation SummaryまたはValidation Messageを使用したくありません。代わりに、エラーをチェックし、エラーがある場合は特定の形式で表示したいです。また、入力コントロールでは、特定のプロパティエラーをチェックし、入力にクラスを追加します。
追伸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" />
....
またはそのようなもの。
UPDATE
私の最終的な解決策は次のようになりました。
<input type="text" value="${ViewData.Model.Name}"
class="text error?{!ViewData.ModelState.IsValid &&
ViewData.ModelState["Name"].Errors.Count() > 0}"
id="Name" name="Name" />
これは、このプロパティにエラーがある場合にのみエラーcssクラスを追加します。
<% 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);
これにより、すべてのエラーとカンマ区切りの1つの文字列が得られます
string validationErrors = string.Join(",",
ModelState.Values.Where(E => E.Errors.Count > 0)
.SelectMany(E => E.Errors)
.Select(E => E.ErrorMessage)
.ToArray());
チャドありがとう!キーに関連するすべてのエラーを表示するために、ここで思いつきました。何らかの理由で、ベース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();
}
これが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())
エラーの原因となったプロパティがわからない場合は、リフレクションを使用して、すべてのプロパティをループできます。
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」のタイプです。