2011-07-10 50 views
1

我在登錄/註冊身份驗證方面遇到了一些問題。ASP.NET MVC DataAnnotation - 轉換爲小寫

首先,我開始時只是輸入字段的正則表達式只接受小寫字母。看起來像最聰明的事情。但那種可怕的結果。基本上,即使我把文字You must use only lowercase letters,人們不讀它,感到沮喪,然後只是不打擾註冊。

那麼,爲了解決這個問題,我修正了它,以便正則表達式可以同時使用大小寫值。當我將這些電子郵件地址存儲在數據庫中時,我只是將它們轉換爲小寫。每個人似乎高興約8秒。

但是我發現自己現在必須在多個地方做到這一點。它越來越討厭。我想知道是否有辦法讓我的視圖模型,就像一個DataAnnotation ..

class LoginViewModel { 
    [ConvertLowercase] 
    public string Email { get; set; } 

    /// ... other view model properties 
} 

這將始終保證這一結果變成小寫它擊中我的控制器之前,因此在視圖模型和瓶頸整個操作將它從邏輯放在每個查詢,請求和查找中的冗餘重複中抽離出來。

有什麼建議嗎?我已經研究過構建自己的自定義數據註釋,但我只能在驗證過程中理解它,而不是實際操縱數據。

回答

3

這裏是一個選項:(創建只讀屬性將被傳遞給控制器​​/業務層)

class LoginViewModel { 

    public string Email { get; set; } 

    public string LowerCaseEmail 
    {         //This is a read only property. 
      get { 
       return Eamil.ToLower(); 
       } 
    } 

    /// ... other view model properties 
    } 
3

恕我直言,DataAnnotations不能也不應該改變數據。這種邏輯應該在自定義模型綁定器或動作過濾器中進行。或者,在將數據保存到數據存儲區之前,可能更好,在數據存儲庫中。

此外,您並不總是必須擁有一切正確的情況下,它可以成爲一個痛苦,以確保,而不是嘗試使用重載字符串比較,等於函數(或Linq函數),使用StringComparisonStringComparer並提供OrdinalIgnoreCase

+0

不能完全確定你的意思了StringComparison和這樣的東西。我從來沒有使用過這些。 – Ciel

+0

當您處理字符串並對其進行比較並期望它們具有各種不同的外殼時,您可以在比較字符串時忽略字符串的字符串(StringComparison.OrdinalIgnoreCase)。 matmat的解決方案也是一種選擇。 DataAnnotations肯定不是。 – mare

+0

這真的很難選擇。兩者都是非常好的答案 - 您的答案在每次使用的基礎上更加明智,但對於解決ViewModels中的問題的具體問題,更簡單的方法更加健壯。感謝您指出這個StringComparison.OrdinalIgnoreCase的事情,我從來沒有見過它之前使用... – Ciel