StringLengthAttribute如何工作?

在使用Entity Framework和ASP.NET MVC3validation我的模型时,我无法使用StringLengthAttribute。

我的模型基于entity framework实体,该实体具有部分类,该部分类使用MetadataType属性告诉MVC在搜索元数据时使用哪种类型。 这显示在下面的代码中:

[MetadataType(typeof(PartMetadata))] public partial class Part { } class PartMetadata { [DisplayName("Part number")] [Required(ErrorMessage="* Required")] [StringLength(50, MinimumLength = 3, ErrorMessage = "* Part numbers must be between 3 and 50 character in length.")] public string Number { get; set; } [StringLength(255, MinimumLength=3, ErrorMessage="* Part descriptions must be between 3 and 255 characters in length.")] public string Description { get; set; } [DisplayName("Drawing required?")] public bool DrawingRequired { get; set; } } 

我遇到的问题是描述字段没有被正确validation。 使用下面的代码我的模型被validation为OK,即使描述字段留空,我也被重定向到我的控制器的索引页面。

 if (ModelState.IsValid) { return RedirectToAction("Index"); } else { return View(); } 

如果我在描述字段中添加RequiredAttribute,那么我的模型将被归类为处于无效状态,并且我的表单将被重新加载,显示所需属性的默认错误消息。 如果我随后编辑描述字段,则它显示我在字符串长度属性中设置的validation错误消息。

这是属性应该如何表现? 使用required属性修饰属性并不是一个问题,但似乎违反直觉,因为不需要该字段我只想确保如果用户输入了某些内容,那么它就属于字符串长度属性的范围。

是的,这是正确的行为。 StringLengthvalidation字符串是否为特定长度,但不要求输入字符串。 使用[Required]装饰描述,这样您就可以同时满足字符串的要求,而StringLength将提供字符串长度的约束。

当调用位于.cshtml文件中时,关键字[Required]可确保检查长度和值。 您不会收到未包含的字段的输入警告,但如果使用[必需]的任何模型字段不可见且未正确填充,您将会收到警告。

因此,可以在不调用所有必填字段的情况下使用模型,并且您的网页可以通过多个页面向模型收集字段值组,或者仅使用模型中的.cshtml中包含的字段。

关键字如下:

  class PartMetadata { [Required] [DisplayName("Part number")] [Required(ErrorMessage="* Required")] [StringLength(50, MinimumLength = 3, ErrorMessage = "* Part numbers must be between 3 and 50 character in length.")] public string Number { get; set; }