【问题标题】:ASP.NET MVC DataAnnotation - Convert to LowercaseASP.NET MVC DataAnnotation - 转换为小写
【发布时间】:2011-10-02 06:35:43
【问题描述】:

关于案例方案,我在网站上的登录/注册身份验证方面遇到了一些问题。

首先,我只是让输入字段的正则表达式只接受小写字母。似乎是最聪明的做法。但这可怕地适得其反。基本上,即使我输入文字You must use only lowercase letters,人们也不会阅读它,感到沮丧,然后就懒得注册了。

然后,为了解决这个问题,我修复了它,使正则表达式可以同时接受大写和小写值。当我将电子邮件地址存储在数据库中时,我只是将它们转换为小写。每个人似乎都开心了大约 8 秒。

但是,我现在发现自己不得不在多个地方执行此操作。它变得令人讨厌。我想知道是否有办法为我的 ViewModel 制作 DataAnnotation,比如 ..

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

   /// ... other view model properties
}

这将始终确保该结果在到达我的控制器之前变为小写,从而使 ViewModel 的整个操作成为瓶颈,并使其远离将逻辑放入每个查询、请求和查找的冗余重复。

有什么建议吗?我已经研究过构建自己的自定义数据注释,但我只是在验证过程中设法理解它,而不是实际操作数据。

【问题讨论】:

    标签: asp.net-mvc-3 data-annotations


    【解决方案1】:

    这是一种选择:(创建要传递给控制器​​/业务层的只读属性)

    class LoginViewModel {
    
         public string Email { get; set; }
    
         public string LowerCaseEmail  
         {                                    //This is a read only property.
              get { 
                    return Eamil.ToLower();
                  }
         }
    
         /// ... other view model properties
      }
    

    【讨论】:

      【解决方案2】:

      恕我直言,DataAnnotations 不能也不应该更改数据。这种逻辑应该放在自定义模型绑定器或动作过滤器中。或者,可能更好的是,在将数据保存到数据存储之前在数据存储库中。

      此外,您不必总是将所有内容都设置为正确的大小写,确保而不是尝试使用采用 StringComparison 的字符串比较、Equals 函数(或 Linq 函数)的重载可能会变得很痛苦或StringComparer 并提供OrdinalIgnoreCase 给它。

      【讨论】:

      • 不完全确定您对 StringComparison 等的含义。我以前从未使用过这些。
      • 当您处理字符串并比较它们并期望它们具有各种大小写时,您可以 string.Equals(StringComparison.OrdinalIgnoreCase) 在比较字符串时忽略大小写。 matmat 的解决方案也是一种选择。 DataAnnotations 肯定不是。
      • 这真的很难选择。两者都是非常好的答案 - 您的答案在每次使用的基础上更加智能,但对于与解决我的 ViewModel 中的问题相关的特定问题,更简单的方法更稳健一些。感谢您向我指出这个 StringComparison.OrdinalIgnoreCase 的东西,我实际上从未见过它以前使用过......
      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 2023-02-02
      • 2015-12-14
      • 1970-01-01
      • 2023-04-07
      • 2013-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多