2011-03-09 87 views
1

我想實現我的asp.net MVC 2應用程序數據驗證,以下斯科特谷的好貼在這裏:http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx自定義驗證在MVC2澄清 - 繼斯科特谷的一個例子

我現在需要的不僅僅是基本的驗證更多(Required,Range,StringLength ...)

我想實現一個重複的檢查器,但不幸的是他的帖子開始丟失自定義驗證部分中的細節。

參見:

第4步:創建自定義[郵件]驗證屬性

.NET框架中的System.ComponentModel.DataAnnotations命名空間包括了許多內置的驗證屬性,這些屬性可以使用。我們在上面的示例中使用了4個不同的 - [必需],[字符串長度],[範圍]和[常規表達式]。

您還可以選擇定義您自己的自定義驗證屬性並使用它們。您可以通過派生自System.ComponentModel.DataAnnotations命名空間中的ValidationAttribute基類來定義完全自定義的屬性。或者,如果您只想擴展其基本功能,則可以選擇從任何現有的驗證屬性派生。

所以這就是我到目前爲止......我從哪裏去這裏?

(請注意,我簡化了這個對我的問題的緣故,我認識到檢查重複的人對象在現實生活中,你將不得不做的比第一次檢查和姓)

[MetadataType(typeof(PersonMetaData))] 
public partial class Person 
{ 
    //Validation rules for the Person class 

    [Bind(Exclude = "PersonID")] 
    public class PersonMetaData 
    { 
     //[DisplayName("Person")] 
     [Required(ErrorMessage = "A Person Code is required")] 
     [DuplicatePerson(ErrorMessage = "Bad!")] 
     public object PersonCode { get; set; } 
    } 
} 

public class DuplicatePersonAttribute : ValidationAttribute 
{ 
    readonly PeopleDB peopleDB = new PeopleDB(); 

    public bool IsDuplicate(object value) 
    { 
     //var isDuplicate = peopleDB.People.Select(x => x.PersonCode == value); 

     //Return false if duplicate in DB 

     return false; 
    } 
} 
+0

我會從「ValidationAttribute'提供什麼覆蓋?」我傾向於使用自定義驗證,因爲在同一個類上有驗證方法的好處。 – arootbeer 2011-03-09 06:03:44

回答

-1

繼SoC(分離關注),你不應該在模型上做這種驗證,而應該在控制器上進行驗證。

+0

這是絕對沒有幫助的,我也覺得很奇怪,斯科特古思會寫教程提倡反對最佳實踐...如果應該在控制器中完成,您仍然不回答我的問題或提供任何有關如何實施的信息。 – baron 2011-03-10 00:15:00

+0

我在說的是你的模型或者你的屬性都不應該意識到潛在的持久性。爲了簡單起見,不要忘記博客文章中的示例並不遵循最佳做法。我想說的是,你應該通過查詢持久層來確保控制器上沒有重複。 – 2011-04-09 08:43:51

0

這裏的東西我使用強制執行用戶註冊郵件獨特:

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property,=的AllowMultiple假,繼承= TRUE)] 公共類UniqueEmailAttribute:ValidationAttribute { 公共UniqueEmailAttribute() :基座( 「爲 '{0}' 已被使用的值」) { }

public override bool IsValid(object value) 
{ 
    string toCheck = value as string; 
    if(String.IsNullOrEmpty(toCheck)) return false; 

    return (DataRepository.GetMembersByEmail(toCheck).Count() == 0); 
} 

[Inject] 
public IDataRepository DataRepository { get; set; } 

}

這裏唯一不合理的解釋是裝飾DataRepository屬性的[Inject]屬性。它由nInject庫提供,作爲執行依賴注入(控制反轉)的手段,以便我可以將數據庫訪問與應用程序分開。但在集成DI之前,我只是創建了一個具體DataRepository對象的實例並使用了它(這當然不是好習慣,這就是爲什麼我去了nInject路由)。