StringLength vs MaxLength使用实体框架EF代码优先将ASP.NET MVC属性


152

[MaxLength][StringLength]属性的行为有何区别?

据我所知([MaxLength]可以验证数组最大长度的例外),它们是相同的,并且有些多余吗?


1
我不知道有关ASP.NET MVC但EF应该是没有区别:stackoverflow.com/questions/5414611/...
拉吉斯拉夫Mrnka

1
更改时,stringLength不会影响迁移列的大小。
卡布隆

实际上,@ CasBloem StringLength确实会被EntityFramework拾取,并且会影响列的长度-至少在版本6中
如此。– jakejgordon,

Answers:


203

MaxLength用于实体框架,以决定创建数据库时将字符串值字段设置为多大。

从MSDN:

指定属性中允许的数组或字符串数​​据的最大长度。

StringLength是一个数据批注,将用于验证用户输入。

从MSDN:

指定数据字段中允许的字符的最小和最大长度。


10
另请注意,默认情况下,MVC 3不会被识别MaxLengthAttribute,而EF会识别StringLengthAttribute
2011年

15
因此,实际上不需要MaxLength,因为您可以在EF中使用StringLength,而且它还可以推断字符串字段的大小。他们为什么还要创建MaxLength?
Matt Johnson-Pint

4
@MattJohnson-我似乎记得创建新的MaxLength属性的决定是针对语义的,因为StringLength隐含字符串数据,但MaxLength也可以应用于二进制数据。但这肯定不方便。
2012年

1
@MartinSmith-我刚刚尝试使用StringLength,它为我工作,并且我使用的是EF6 RC1,所以我认为评论不正确
Colin

5
那么为什么[MaxLength]会有一个ErrorMessage?
Zapnologica

46

我刚刚从另一篇文章中学到了一些快速但极为有用的附加信息,但似乎找不到该文档的文档(如果有人可以在MSDN上共享指向该文档的链接,那将是惊人的):

与这些属性关联的验证消息实际上将替换与属性关联的占位符。例如:

[MaxLength(100, "{0} can have a max of {1} characters")]
public string Address { get; set; }

如果超出字符数限制,将输出以下内容: “地址最多可以包含100个字符”

我知道的占位符是:

  • {0} =属性名称
  • {1} =最大长度
  • {2} =最小长度

非常感谢bloudraak最初指出了这一点。


12

以下是在中同时使用[MaxLength][StringLength]属性时的结果EF code first。如果两者都使用,则[MaxLength]赢得比赛。请参阅studentname下面课程的列中的测试结果

 public class Student
 {
    public Student () {}

    [Key]
    [Column(Order=1)]
    public int StudentKey { get; set; }

    //[MaxLength(50),StringLength(60)]    //studentname column will be nvarchar(50)
    //[StringLength(60)]    //studentname column will be nvarchar(60)
    [MaxLength(50)] //studentname column will be nvarchar(50)
    public string StudentName { get; set; }

    [Timestamp]
    public byte[] RowVersion { get; set; }
 }




1

我通过在上下文中添加以下行来解决此问题:

modelBuilder.Entity<YourObject>().Property(e => e.YourColumn).HasMaxLength(4000);

不知何故,[MaxLength]对我不起作用。


0

当使用该属性限制网页上表单文本的最大输入长度时,StringLength似乎会生成maxlength html属性(至少在我的MVC 5测试中)。然后选择一个选项,该选项将决定您要如何提醒用户这是最大文本长度。使用stringlength属性,用户将无法直接键入超出允许长度的字符。maxlength属性不会添加此html属性,而是会生成数据验证属性,这意味着用户可以输入超出指定长度的内容,而防止输入更长的内容取决于当他移至下一个字段或单击“提交”(或如果禁用了javascript,则进行服务器端验证)。在这种情况下,可以通过错误消息将限制通知给用户。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.