2011-04-18 23 views
5

örneğin böyle Resource.resx dosyalarını kullanarak hata mesajlarını yerelleştirilmesine şimdi kolaydır: ı Öğrenci belirli bir ay için bir Ödeme yapmış durumdadır olmadığını kontrol etmek istediğinizi varsayalım, ŞimdiASP.NET MVC 3 ile sigara Veri ek açıklama Hataları lokalize etmenin en iyi yolu nedir? Veri Ek Açıklamaları ile

public class Student 
{ 
    . . . 

    [Required(ErrorMessageResourceName ="Required", 
    ErrorMessageResourceType = typeof(StudentResources))] 
    [StringLength(16)] 
    [Display(Name = "FirstName", ResourceType = typeof(StudentResources))] 
    public string FirstName { get; set; } 

    . . . 
} 

ve yıl: çoktan Ödeme yapmışsa, benim Hizmetler katmanda bulunan aşağıdaki yapıyorum

public bool CheckIfAlreadyPaid(Payment payment) 
{ 
    return repository.GetPayments().Any(p => p.StudentId == payment.StudentId && 
             p.Month == payment.Month && 
             p.Year == payment.Year); 
} 

:

çalışıyor
if (CheckIfAlreadyPaid(payment)) 
{ 
    modelState.AddModelError("AlreadyPaid", 
    Resources.Views.Payment.PaymentCreateResources.AlreadyPaid); 
} 

, ancak Hizmet katmanındaki Kaynak dosyasına başvurma konusunda kendime güvenmedim.

Model özelliklerine (Veri Açıklaması) bağlı olmayan hata iletilerini standartlaştırmanın veya daha iyi bir yolu var mı? - iş mantığı kurallarından kaynaklanan hatalar var mı? Bu hataları hala ModelStateDictionary dosyasına eklemem gerekir mi?

cevap

0

Ben farklı bir şekilde yaptık. Ödeme zaten yapılmış olup olmadığını kontrol etmek için Service katmanı kullanılır. Benim Controller içinde yerelleştirilmiş bir dize kaynağına ileten ModelState nesnesine bir doğrulama hata iletisi ekliyorum. Şimdi bu yaklaşımla daha rahat hissediyorum. İşte

kod:

/// <summary> 
/// Performs validation of business logic... 
/// </summary> 
/// <param name="payment"></param> 
/// <returns></returns> 
private bool ValidatePayment(Payment payment) 
{ 
    if (paymentService.IsPaymentMade(payment)) 
    { 
     ModelState.AddModelError("AlreadyPaid", Localization.AlreadyPaid); 
    } 

    return ModelState.IsValid; 
} 

DÜZENLEME:

benim cevap tamamlamak için, sadece bulunan bugün ValidationSummary@Html.ValidationSummary(true) istediğim tam olarak ne yaptığı:

Html.ValidationSummary bir döner'teki doğrulama iletilerinin sırasız listesi (ul öğesi)nesnesi ve isteğe bağlı olarak yalnızca model modeli düzeyinde hataları görüntüler.

Ben true geçiyordu ve o-ecek sadece sayfanın üst kısmında özetle sadece ekran modeli düzey hataları (non veri açıklama hataları). Ediyorum Bu harika ancak işe yarayacaksa ... :)

ValidationSummary(true) ayarlandığında, model özelliklerine bağlı olmayan özel hata iletilerinin görünmediği bir sorunla karşı karşıya kalıyordum. Daha sonra Google’ı kullanarak arama yaptım ve bu post’u buldum. Onun çözümünü denedim ama işe yaramadı. Sonra biraz daha aradı ve Google Books bu link (Steven Sanderson tarafından Pro ASP.NET MVC 2 Çerçevesi) bulundu.

Boş bir dizeyi anahtar (string.Empty) olarak geçerek orada açıklanan şeyi denedim ve işi yaptı.

if(paymentService.IsPaymentMade(payment)) 
{ 
    ModelState.AddModelError(string.Empty, Localization.PaymentAlreadyCreated); 
} 
0

Katılıyorum, hizmet katmanında olması gerektiğini düşünmüyorum. o da özel bir veri doğrulama özelliğinde koymak, ya da (iyi bir seçenek olabilir Fluent Validation kullanarak) o seviyede başka yaklaşımla ele alınabileceği gibi görünüyor. Her iki durumda da, validasyon MVC uygulamasında kaldığı sürece, mesajları saklamak için kaynak dosyaları kullanarak rahat olabilirsiniz.

İlgili konular