2011-04-18 30 views
5

隨着數據註釋它現在很容易本地化使用這樣Resource.resx文件,例如錯誤信息:ASP.NET MVC 3本地化非數據註釋錯誤的最佳方式是什麼?

public class Student 
{ 
    . . . 

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

    . . . 
} 

現在,讓我們說我要檢查,如果一個學生已經取得了給定月份付款和同期:

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

如果他已經作出的支付,我做我的服務層以下:

if (CheckIfAlreadyPaid(payment)) 
{ 
    modelState.AddModelError("AlreadyPaid", 
    Resources.Views.Payment.PaymentCreateResources.AlreadyPaid); 
} 

它的工作原理,但是我並沒有對在服務層中引用資源文件充滿信心。

是否有一種標準或更好的方式來定位與模型屬性無關的錯誤消息(數據註釋) - 來自業務邏輯規則的錯誤?我還應該將這些錯誤添加到ModelStateDictionary中嗎?

回答

0

我以不同的方式做到了。 Service圖層用於檢查付款是否已經完成。在我的Controller中,我向ModelState對象添加一個驗證錯誤消息,並將消息傳遞給本地化的字符串資源。現在我對這種方法感到更加舒適。

下面的代碼:

/// <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; 
} 

編輯:

爲了配合我的回答,我才發現今天ValidationSummary@Html.ValidationSummary(true)不正是我想要的:

Html.ValidationSummary返回無序列表(ul元素) 的驗證消息在ModelStateDictionary對象,並可選地僅顯示模型模型級錯誤。

我正在通過true,它只會在頁面頂部的摘要中顯示模型級錯誤(非數據註釋錯誤)。這是偉大的,但只有當它的工作...... :)

我遇到了一個問題,當我設置ValidationSummary(true)沒有出現我的自定義錯誤消息未綁定到模型屬性。然後我用谷歌搜索,發現這post。我嘗試了他的解決方案,但沒有奏效。然後我再搜索了一下,在Google Books(Steven Sanderson的Pro ASP.NET MVC 2 Framework)中發現了這個link

我試着描述那裏傳遞一個空字符串作爲鍵(string.Empty),它做了這項工作。

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

我同意,我不認爲應該在服務層。它看起來可以放入自定義數據驗證屬性中,或者在該級別使用其他方法處理(使用Fluent Validation可能是一個不錯的選擇)。無論哪種方式,我認爲只要驗證保留在MVC應用程序本身中,就可以使用資源文件來存儲消息。

相關問題