StringLengthAttribute如何工作?

时间:2011-10-19 11:46:45

标签: c# asp.net asp.net-mvc-3 validation attributes

在使用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属性修饰属性不是问题,但似乎违反直觉,因为字段不是必需的我只是想确保如果用户输入了某些东西,那么它就属于字符串长度属性的范围。

3 个答案:

答案 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 是如何工作的?”

的部分答案