2010-07-29 34 views
2

我即將實現一個類來表示驗證錯誤。該類肯定會包含一個名爲Message的字符串值,它是向用戶顯示的默認消息。我還需要一種方法來向程序員表示驗證錯誤。這個想法是,應該有一個簡單的方法來確定是否發生了特定的驗證錯誤。C中驗證錯誤類的明智模式#

實現一個名爲Type的字符串成員會很簡單,但要確定ValidationError是否屬於該類型,我需要記住描述該類型的字符串。

if (validationError.Type == "PersonWithoutSurname") DoSomething(); 

顯然,我需要更強類型的東西。枚舉將是一件好事:

if (validationError.Type == ValidationErrorType.PersonWithoutSurname) DoSomething(); 

但考慮到潛在的數百種類型的驗證錯誤的,我可以用一個醜陋的枚舉數百值的結束。

它也發生在我使用的子類:

if (validationError.GetType() == typeof(PersonWithoutSurnameValidationError)) DoSomething(); 

但後來我的類庫散落着幾百個類,其將主要每一次使用。

你們是做什麼的?我可以花幾個小時在這種事情上苦苦掙扎。

回答誰來提出我使用的建議。枚舉建議是要擊敗的。

回答

3

我使用FluentValidation,您可以在其中爲每個類設置規則,併爲每個屬性使用默認或可自定義的消息。

因爲它是一口流利的框架,你可以結合規則,如:

RuleFor(customer => customer.Address) 
    .NotNull().Length(20, 250).Contains("Redmond") 
    .WithMessage(@"Address is required, it must contain 
    the word Redmond and must be between 20 and 250 characters in length."); 

爲Customer類的驗證的典型用法:

public class CustomerValidator: AbstractValidator<Customer> { 
    public CustomerValidator() { 
    RuleFor(customer => customer.Surname).NotEmpty(); 
    RuleFor(customer => customer.Forename).NotEmpty().WithMessage("Please specify a first name"); 
    RuleFor(customer => customer.Company).NotNull(); 
    RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount); 
    RuleFor(customer => customer.Address).Length(20, 250); 
    RuleFor(customer => customer.Postcode).Must(BeAValidPostcode).WithMessage("Please specify a valid postcode"); 
    } 

    private bool BeAValidPostcode(string postcode) { 
    // custom postcode validating logic goes here 
    } 
} 

Customer customer = new Customer(); 
CustomerValidator validator = new CustomerValidator(); 
ValidationResult results = validator.Validate(customer); 

bool validationSucceeded = results.IsValid; 
IList<ValidationFailure> failures = results.Errors; 
//Bind these error messages to control to give validation feedback to user; 
+1

那麼代碼是什麼將檢查驗證結果,看看客戶的姓是空的? – David 2010-07-29 15:59:51

+0

字符串的默認值是「{propertyname}不能爲空」,這會導致「姓氏不能爲空」。 – 2010-07-29 16:03:36

+0

如果您想覆蓋默認消息,則只能使用WithMessage。默認消息是在resx文件中的幫助,所以如果你喜歡,你可以改變它們。還有許多語言的默認消息的resx文件。 – 2010-07-29 16:04:00

-1

如果問題是存儲類型(特別是你可以添加新的)XML中的配置文件或者數據庫驅動的東西呢?

有了一個app.config你可以有:

這將被調用代碼:

//Generate the error somehow: 
Validation.ErrorType = 
    ConfigurationManager.AppSettings["PersonWithoutSurnameValidationError"].Value; 

//Handle the error 
[Your string solution here] 

這樣,你讓你的錯誤類型的地方記錄您的代碼之外,使他們'更容易記住。另一方面,如果你的主要問題是存儲,所以你可以得到正確的類型來處理,堅持使用枚舉。

+0

使用應用程序配置文件,您失去了業務層可移植性,但我當然可以使用業務層項目中嵌入的XML文件。我並不需要我可以即時編輯的東西,只需在代碼中使用即可。 – David 2010-07-29 16:10:33

+0

-1用於暗示在appsettings中存在錯誤。你最好將它存儲在一個存儲庫(數據庫)或'.resx'資源文件中。 – 2011-10-06 14:57:27

0

我嚴重不明白你爲什麼陷入這麼多麻煩....

如果驗證字段,你在做什麼,然後我通常會添加一個正則表達式驗證&和必填字段驗證。對於某些字段,我爲自己的一套規則添加自定義驗證器。但就是這樣。對於客戶端以及服務器端。我所做的只是一頁。驗證命令,如果曾經拋出錯誤意味着客戶端腳本已被修改&我通常重新加載頁面作爲響應。

另外,如果我想處理一個檢查單值我用

System.Text.RegularExpressions.Regex.IsMatch(... 

所以有更多的這個?如果有請指出。

+0

他正在嘗試根據特定驗證類型執行一些操作。這是錯誤處理,而不是驗證。在OP似乎也驗證規則下來,但他擔心他會有他想在洽格式顯示這些錯誤類型的值可能足以驗證錯誤。 – AllenG 2010-07-29 16:03:13

+0

這更多的是將驗證規則添加到底層域實體,而不是頁面的控件。 這樣,你可以港口業務層到另一個前端(例如,從網絡到Windows)和域實體的有效性仍然可以很容易地檢查。 – David 2010-07-29 16:03:28

+0

哦,謝謝你讓我知道。 Sry OP我想我在這裏沒有幫助。 – loxxy 2010-07-29 16:07:06