ASP.NET MVC'de Model Durumu Hataları koleksiyonunu nasıl edinebilirim?


146

Bir görünümdeki hata koleksiyonunu nasıl edinirim?

Html Yardımcısı Doğrulama Özeti veya Doğrulama Mesajını kullanmak istemiyorum. Bunun yerine hataları kontrol etmek ve varsa bunları belirli bir biçimde görüntülemek istiyorum. Ayrıca giriş kontrollerinde belirli bir özellik hatası olup olmadığını kontrol etmek ve girişe bir sınıf eklemek istiyorum.

PS Spark View Engine kullanıyorum ama fikir aynı olmalı.

Ben de şöyle bir şey yapabileceğimi düşündüm ...

<if condition="${ModelState.Errors.Count > 0}">
  DispalyErrorSummary()
</if>

....and also...

<input type="text" value="${Model.Name}" 
       class="?{ModelState.Errors["Name"] != string.empty} error" />

....

Ya da böyle bir şey.

GÜNCELLEME

Son çözümüm şuna benziyordu:

<input type="text" value="${ViewData.Model.Name}" 
       class="text error?{!ViewData.ModelState.IsValid && 
                           ViewData.ModelState["Name"].Errors.Count() > 0}" 
       id="Name" name="Name" />

Bu, yalnızca bu özellikte bir hata varsa css sınıfını ekler.


Yanıtlar:


212
<% ViewData.ModelState.IsValid %>

veya

<% ViewData.ModelState.Values.Any(x => x.Errors.Count >= 1) %>

ve belirli bir mülk için ...

<% ViewData.ModelState["Property"].Errors %> // Note this returns a collection

1
ModelState özelliği, ViewData.ModelState ["Name"] anahtar adını geçirmek için hatayı almak için sözlük

"ViewData.ModelState [" Özellik "] ile ilgili. Hatalar" "Özellik" adında bir anahtar yoksa bu bir boş referans istisnası oluşturur mu? Hatalar bölümünü okumadan önce ViewData.ModelState ["Özellik"] üzerinde boş değeri kontrol etmek daha iyi olur mu?
David Hollowell - MSFT

@DaveH Evet, önce varoluşu tamamen kontrol etmelisin
Alex Lyman

61

Sadece ModelState'teki hataları almak için bu Linq'i kullanın:

var modelStateErrors = this.ModelState.Keys.SelectMany(key => this.ModelState[key].Errors);

2
bu, belirtilen ada sahip bir anahtar yoksa boş bir referans istisnası oluşturur mu? Hatalar bölümünü okumadan önce ViewData.ModelState [key] üzerinde null olup olmadığını kontrol etmek daha iyi olur mu?
David Hollowell - MSFT

5
Bu.ModelState.Keys üzerinde yineleyerek başladığımız için, bir KeyNotFoundException potansiyelini görmüyorum. Bence bu çek fazla olur.
Chris McKenzie


28

Bu size virgülle ayrılmış tüm hataları içeren tek bir dize verecektir.

string validationErrors = string.Join(",",
                    ModelState.Values.Where(E => E.Errors.Count > 0)
                    .SelectMany(E => E.Errors)
                    .Select(E => E.ErrorMessage)
                    .ToArray());

Bu listenin tamamında bulduğum, aslında hataları gösteren tek şey bu! Teşekkürler
Jamie

6

Teşekkürler Chad! Anahtarla ilgili tüm hataları göstermek için, işte bulduğum şey. Bazı nedenlerden dolayı, temel Html.ValidationMessage yardımcısı yalnızca anahtarla ilişkili ilk hatayı gösterir.

    <%= 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();
    }

6

Yukarıdan birkaç cevabı bir araya getirerek, bunu kullanmaya son verdim:

var validationErrors = ModelState.Values.Where(E => E.Errors.Count > 0)
    .SelectMany(E => E.Errors)
    .Select(E => E.ErrorMessage)
    .ToList();

validationErrorsyukarı bir varlık biter List<string>her hata mesajı içerdiğini. Oradan, bu listeyle istediğinizi yapmak çok kolay.

görüntü açıklamasını buraya girin


2

İşte 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())

0

Hataya hangi özelliğin neden olduğunu bilmiyorsanız, yansıma kullanarak tüm özellikler üzerinde döngü yapabilirsiniz:

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" inizin türüdür.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.