当使用实体框架和ASP.NET MVC3验证我的模型时,我无法使用StringLengthAttribute.
我的模型是基于一个实体框架实体,它有一个部分类,它使用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; } }
我遇到的问题是描述字段未被正确验证.使用我的模型下面的代码是有效的,我被重定向到我的控制器的索引页,即使说明字段留空.
if (ModelState.IsValid) { return RedirectToAction("Index"); } else { return View(); }
如果我将一个requiredAttribute添加到描述字段,那么我的模型被归类为无效状态,并且我的表单被重新加载,显示所需属性的默认错误消息.如果我随后编辑说明字段,则显示我在字符串长度属性中设置的验证错误消息.
属性应该如何表现?使用所需属性装饰属性并不是问题,但是似乎不符合直觉,因为该字段不是必需的.我只想确保如果用户输入一些东西,那么它在字符串长度属性的范围内.
解决方法
是的,这是正确的行为. StringLength验证字符串是否为一定长度,但不要求输入字符串.使用[必需]进行装饰描述,这样既有字符串的要求,而StringLength也将为字符串长度提供约束.