ModelState.AddModelError - Bir özellik için olmayan bir hatayı nasıl ekleyebilirim?


190

Ben benim veritabanını kontrol ediyorum Create(FooViewModel fvm){...}olmadığını görmek için fvm.prop1ve fvm.prop2zaten bu kombinasyon var; öyleyse, model durumuna bir hata eklemek, sonra tüm görünümü döndürmek istiyorum. Denedim:

public ActionResult Create(FooViewModel fvm){
    if (ThatComboAlreadyExists(fvm)) {
      ModelState.AddModelError("Model", "There is already one like that");
      return View(fvm);
    }
}

... ama Html.ValidationSummarygörüneceklerini düşündüğüm yerde hiçbir hata görüntüsü almıyorum. "Model" in doğru anahtar olmadığından şüphem var, ancak Google'dan bir şey bulamadım.


Yanıtlar:


330

Sonunda aradığım kullanımın bir örneğini tökezledim - her zamanki gibi çağırdığınız özelliklerden biri yerine genel olarak Model'e bir hata atamak için:

ModelState.AddModelError(string key, string errorMessage);

ancak anahtar için boş bir dize kullanın:

ModelState.AddModelError(string.Empty, "There is something wrong with Foo.");

Hata mesajı, <%: Html.ValidationSummary() %>beklediğiniz gibi görünecektir .


22
Bu durum beni düşündürüyor: Neden ModelState.AddError(errorMessage)ya da ModelState.AddGlobalError(errorMessage)... gibi bir yöntem bulunmuyor? Herhangi bir modelin özellikleriyle ilgili olmayan bir hata mesajının nasıl ekleneceğini öğrenmek sezgisel ve daha kolay olurdu.
Rubens Mariuzzo

@Rubens: Doğru, ancak böyle bir yöntemi uzantı yöntemleriyle kolayca ekleyebilirsiniz.
Johnny5

2
Hatayı ayrıca@Html.ValidationMessage(string.Empty)
Ben Foster

anahtar, modelinizin özelliğe bağlı olması ve hataya sahip olması - açık olmaktır.
niico

1
ValidationSummaryErrors(bool excludePropertyErrors)Onun argümanı yanlış veya olmayan tek özellik özgü ise onun argümanı doğruysa aşırı yük (anahtar "" =) hataları tüm doğrulama hatalarını gösterecektir.
Suncat2000

26

Model hatasını modelinizin herhangi bir özelliğine ekleyebilirsiniz, yeni bir özellik oluşturmakla ilgili bir şey yoksa öneririm.

Bir örnek olarak, e-postanın DB'de zaten kullanılıp kullanılmadığını kontrol ediyoruz ve hatayı eylemdeki E-posta özelliğine ekliyoruz, böylece görünümü döndürdüğümde bir hata olduğunu ve bunu kullanarak nasıl gösterileceğini biliyorlar.

<%: Html.ValidationSummary(true)%>
<%: Html.ValidationMessageFor(model => model.Email) %>

ve

ModelState.AddModelError("Email", Resources.EmailInUse);

1
Bu benim durumumda mantıksız görünüyor - belirli bir col1 & col2 kombinasyonu zaten veritabanında olup olmadığını görmek için kontrol, bu yüzden benim ViewModel IsDuplicateOfAnotherRow özelliği olması doğru görünmüyor. Görünen o ki, modelinize bir hata ekleyebilirsiniz - cevabımı görün.
Scott Baker

1
AddModelError için "Email" dizesini kırılgan bir değişmez dizge kullanmadan almanın bir yolu var mı? Gibi (m=>m.email).SomeMagicToString()mi?
Snekse

Ben öyle düşünmüyorum, sihirli
iplerle gitmelisin

4
nameofC # 6.0 çözer bu sihirli dize sorunu geliyor operatörü. msdn.microsoft.com/tr-tr/magazine/dn802602.aspx
RJ Cuthbertson

3

Model dot özelliğini dizelere koymak benim için çalıştı: ModelState.AddModelError("Item1.Month", "This is not a valid date");


2
Bu gerçekten kullanıcı arayüzünüzde geçersiz bir Ay gösterir, ancak orijinal sorunu çözmez.
Scott Baker

2
Özgün sorun, yöntemde "anahtar" ın neyi temsil ettiğini anlamamaktan kaynaklanmaktadır. Bu, "anahtar" işlevlerinin nasıl çalıştığına biraz ışık tutar, bu nedenle anahtarın yalnızca bir özellik adı olması gerekmediğini bilmek iyi olur, aynı zamanda iç içe özelliklere veya String.Empty özel değerine de başvurabilir.
Triynko
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.