2012-10-02 23 views
11

Belirli bir viewModel özelliği için istemci tarafı ve sunucu tarafı doğrulaması geliştiriyorum. .cshtml dosyasındaValidationMessageFormModelError (anahtar, mesaj) ile birlikte. Anahtar nedir?

bu koyun: iş doğrulama için Kontrolörü olarak

@Html.DropDownListFor(model => model.EntityType.ParentId, Model.ParentTypeList, "") 
@Html.ValidationMessageFor(model => model.EntityType.ParentId) 

catch (BusinessException e) 
{ 
    ModelState.AddModelError("EntityType.ParentId", Messages.CircularReference); 
} 

beklendiği gibi yukarıdaki eserler: Bir istisna yakalanması halinde, mesajı yanında görünür açılır liste. Bununla birlikte, bu yolun çok zarif olmadığını görüyorum. cshtml'da, doğrulama hakkında gerekli tüm bilgileri oluşturmak için bir yöntem kullanıyorum. Kontrolörde, kesin anahtar dizisini bilmeli ve kullanmalıyım.

Bunu yapmanın daha iyi bir yolu yok mu?

Onun yerine bir dize anahtar için bir lambda ifadesi alacak bir uzantısı yöntem yazabilirsiniz
+0

Bu bağlantı bazı ek sağlar içgörü ve anahtarı doğrudan bir dize olarak değil, bir ifade olarak ifade etmenin bir yolu: http://stackoverflow.com/questions/11090445/how-to-get-a-modelstate-key-of-an-item-in- bir liste heres başka bir kaynak İfade için http://stackoverflow.com/questions/8793799/get-reference-to-object-from-c-sharp-expression – bUKaneer

cevap

21

:

public static class ModelStateExtensions 
{ 
    public static void AddModelError<TModel, TProperty>(
     this ModelStateDictionary modelState, 
     Expression<Func<TModel, TProperty>> ex, 
     string message 
    ) 
    { 
     var key = ExpressionHelper.GetExpressionText(ex); 
     modelState.AddModelError(key, message); 
    } 
} 

ve sonra bu yöntemi kullanın:

catch (BusinessException e) 
{ 
    ModelState.AddModelError<MyViewModel, int>(
     x => x.EntityType.ParentId, 
     Messages.CircularReference 
    ); 
} 
+0

için bir sarmalayıcı yöntemi sağlayan ce teşekkür ederiz. Mükemmel çalışıyor –

+0

Neden kütüphanede değil? – UserControl

+0

@UserControl, çünkü her şey çerçevenin bir parçası olamaz. Bir özelliğin ihtiyaçlar çerçevesinin bir parçası olması için yazılması, test edilmesi ve belgelenmesi. Bazen hangi özelliklerin piyasaya sürüleceğine dair bir karar vermeniz gerekir, aksi halde asla serbest bırakamazsınız :-) Böylece, Microsoft bu özelliği uygulamak, test etmek ve belgelemek için zamanı bulamadı. Bu yüzden kütüphanenin bir parçası değil. –

0

Sen doğrulama olmasını istediğim Hem istemci hem de sunucu tarafında ve ayrıca zarif bir çözüm arıyorsanız, neden bir özel ValidationAttribute oluşturmayı deneyebilirsiniz.

4

Ben @Darin Dimitrov çözümü uygulayın ama <MyViewModel, int> yüzden bazı farklı bir şekilde kullanılan kaçınmak istiyor ama bunun için

MyViewModel object variable.

public static class ModelStateExtensions 
{ 
    public static void AddModelError<TModel, TProperty>(this TModel source,   
                Expression<Func<TModel, TProperty>> ex, 
                string message, 
                ModelStateDictionary modelState) 
    { 
     var key = System.Web.Mvc.ExpressionHelper.GetExpressionText(ex); 
     modelState.AddModelError(key, message); 
    } 
} 
Nasıl Kullanılır gerekir:

catch (BusinessException e) 
{ 
    objMyViewModel.AddModelError(x => x.EntityType.ParentId, 
           Messages.CircularReference, 
           ModelState); 
} 
+4

Benim için daha sezgisel olur uzantısı yöntemi imzası: 'AddModelError (bu ModelStateDictionary modelState, TModel modeli, İfade > ex, dize mesajı)'. Bu şekilde 'ModelState.AddModelError (model, x => x.Email, "Geçersiz e-posta")) gibi kullanabilirsiniz. – benmccallum

İlgili konular