2011-04-21 13 views
152

fvm.prop1 ve fvm.prop2 zaten bu bileşimde olup olmadığını görmek için veritabanımı Create(FooViewModel fvm){...} numaralı veritabanında denetliyorum; eğer öyleyse, modele bir hata eklemek ve daha sonra tüm görünümü döndürmek istiyorum.ModelState.AddModelError - Bir özellik için olmayan bir hatayı nasıl ekleyebilirim?

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

... ama göründükleri varsayıyorum nerede olduğunu doğrulama Özetle, hataların hiçbir görüntüsünü almak: denedim. "Model" in doğru anahtar olmadığından şüphe duyuyorum, ancak la Google’da hiçbir şey bulamadım.

+0

http://stackoverflow.com/a/2819178/1193727 – resnyanskiy

cevap

267

sonunda aradığım kullanım an example tökezledi

ModelState.AddModelError(string key, string errorMessage); 

ama anahtar için boş bir dize kullanın: beklediğiniz gibi

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

hata mesajı <%: Html.ValidationSummary() %> kendini sunacak. dizeleri model nokta özelliğini koyarak

+14

Bu durum beni düşünmemi sağlıyor: Neden ModelState.AddError (errorMessage) 'veya' ModelState.AddGlobalError (errorMessage) 'gibi bir yöntem yoktur. ... herhangi bir modelin özellikleriyle ilgili olmayan bir hata mesajının nasıl ekleneceğini öğrenmek sezgisel ve kolay olurdu. –

+0

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

+2

Ayrıca, hataya sahip modele bağlı olan '@ Html.ValidationMessage (string.Empty)' –

23

Model hanesini modelinizin herhangi bir özelliğine ekleyebilir, yeni bir özellik oluşturmakla ilgili hiçbir şey bulunmadığını öneririm.

Örnek olarak, e-postanın zaten DB'de kullanımda olup olmadığını kontrol edip hatayı E-posta özelliğine ekledik. Görünümü döndürdüğümde hata olduğunu ve nasıl gösterileceğini biliyorlar : her zamanki gibi aramak, bunun yerine bir özellikleri var, genel olarak Modeli bir hata atamak -

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

ve

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

Bu benim durumumda aksine olduğunu düşündüğü - Belli bir kombinasyon olmadığını görmek için kontrol ediyorum col1 & col2 zaten veritabanında var, bu yüzden ViewModel benim IsDuplicateOfAnotherRow özelliği sahip görünmüyor. Çıktığında, modelinize bir hata ekleyebilirsiniz - cevabımı görün. –

+0

Hassas bir literal dize kullanmadan AddModelError için "E-posta" dizesini almanın bir yolu var mı? Gibi (m => m.email) .SomeMagicToString() '? – Snekse

+0

Sanmıyorum, sihirli bir ip ile gitmelisiniz ... en iyi değil ama yine de iyi bir çözüm – VinnyG

1

benim için çalıştı: ModelState.AddModelError("Item1.Month", "This is not a valid date");

+1

Gerçekten de UI'nizde geçersiz bir Ay gösterecektir, ancak orijinal sorunu çözmez. –

+2

Özgün sorun, yöntemde "anahtar" ın neyi temsil ettiğini anlamadan kaynaklanmaktadır. Bu, "anahtar" işlevler hakkında biraz ışık tutar, bu yüzden anahtarın sadece bir özellik adı olmak zorunda olmadığını bilmesi iyi bir şeydir, aynı zamanda iç içe geçmiş özelliklere veya özel bir değer olan String.Empty'ye de başvurabilir. – Triynko

İlgili konular