2012-08-17 26 views
5

'da yazılan bir model için "Anahtar" ı alın. Bu nedenle, bir AddModelError ekleyebilmem için denetleyicideki model nesnesinin anahtarını almaya çalışıyorum. eşdeğer kod bu ValidationMessage yapışır Key adı denetleyicisi eklemek için nedir BenceDenetleyici

Ben

@Html.ValidationMessageFor(model => model.Email) 

kullanın.

cevap

2
ModelState.AddModelError("Email", "the email is invalid"); 

Fakat genellikle bu, denetleyicinizde el ile yapmanız gereken bir şey değil, ancak bir doğrulayıcı kullanmanız gerekir. Örneğin, bu E-posta mülkünü bazı doğrulama verileri açıklama özelliği ile dekore edebilir veya bana benziyorsan FluentValidation.NET => bu şekilde anahtarlar hakkında kendinize sorular sormamalı ve gerçek doğrulama mantığına odaklanmamalısınız.

+0

Anahtar her zaman adı olacak mı? Bunun oluşturulduğunu düşündüm, bu yüzden her zaman nesne adı olması garanti edilemez mi? –

+0

Her zaman aynı olacaktır. –

+0

Her zaman alan adına eşittir. Sadece temkinli olun çünkü alanı yeniden adlandırırsanız (ReSharper kullanarak bile), bu dizgeyi güncellemez, çünkü sadece rastlantılarla eşleşirler. Neyse ki, bilinmeyen bir anahtar kullanmanın hiçbir yan etkisi olmayacağına inanıyorum (sayfanızı Özel Durumlar yapma gibi yapmak), null'ın kullanılmasına eşdeğerdir. –

17

Sen HtmlHelpers aynı yapar bir uzantısı kullanabilirsiniz ve bu iç içe özellikleri için çalışacaktır:

public static class ModelStateExtensions 
{ 
    public static void AddModelError<TModel>(this ModelStateDictionary dictionary, Expression<Func<TModel, object>> expression, string errorMessage) 
    { 
    dictionary.AddModelError(ExpressionHelper.GetExpressionText(expression), errorMessage); 
    } 
} 

Yani bunun gibi kullanabilirsiniz:

ModelState.AddModelError<TModel>(i => i.Person.Name, "test"); 

eşdeğer

için

Html ile aynı kimliği üretecektir. MVC kaynağında bazı ekstra dezenfektanlar yapıyorlar, ama normal isimlerle problem olmamalı.

+2

Sadece bunu kullanarak bir hataya rastladım. Özellik, bir nesne döndürdüğünden, ifade, dönüştürme (özellik) gibi bir yapıdan farklıysa. Bu durumda ifade metni boş bir dizgeye değerlendirir. İşlevi halka açık statik geçersiz AddModelError (bu ModelStateDictionary sözlüğü, İfade > ifade, string errorMessage) olarak değiştirmenizi ve bunu ModelState.AddModelError ((TModel i) => gibi i) olarak çağırmanızı öneririm. Person.Name, "test") – Sven