在使用Entity Framework和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; }
}
我遇到的问题是描述字段未正确验证。使用下面的代码我的模型被验证为OK,即使描述字段留空,我也被重定向到我的控制器的Index页面。
if (ModelState.IsValid)
{
return RedirectToAction("Index");
}
else
{
return View();
}
如果我在说明字段中添加RequiredAttribute,那么我的模型将被归类为处于无效状态,并且我的表单将被重新加载,显示所需属性的默认错误消息。如果我随后编辑了描述字段,那么它会显示我在字符串长度属性中设置的验证错误消息。
属性应该如何表现?使用required属性修饰属性不是问题,但似乎违反直觉,因为字段不是必需的我只是想确保如果用户输入了某些东西,那么它就属于字符串长度属性的范围。
答案 0 :(得分:21)
是的,这是正确的行为。 StringLength
验证字符串是否为特定长度,但请求表示输入字符串。用[Required]装饰Description,这样你就可以同时拥有字符串,StringLength将提供字符串长度的约束。
答案 1 :(得分:0)
关键字如下:
class PartMetadata
{
// required keyword forces user to enter input
[Required]
[DisplayName("Part number")]
// or [Required(ErrorMessage="* Required")]
// ErrorMessage in string only enforces when data is entered
[StringLength(50, MinimumLength = 3, ErrorMessage = "* Part numbers must be between 3 and 50 character in length.")]
public string Number { get; set; }
答案 2 :(得分:0)
MSDN:您可以在错误消息中使用复合格式占位符:{0} 是属性的名称; {1} 是最大长度; {2} 是最小长度。占位符对应于在运行时传递给 String.Format 方法的参数。
所以,你能做什么
[StringLength(50, MinimumLength = 3, ErrorMessage = "Part {0} must be between {2} and {1} character(s) in length.")]
public string Number { get; set; }
注意 - 1 代表最大值,2 - 代表最小值
^^^ 这也是“StringLengthAttribute
是如何工作的?”