【问题标题】:Data annotation to check if within set of values数据注释以检查是否在一组值内
【发布时间】:2016-11-04 17:53:17
【问题描述】:

当使用数据注释属性验证 string 属性时,有没有人知道验证字符串是一组可能值之一的方法,可能表示为数组或分隔字符串?

这个问题是更通用的,但我遇到的具体实例是一个可以包含 HTTP 方法子集的属性;具体来说,GETPOSTPUTPATCHDELETE

System.ComponentModel.DataAnnotations 命名空间中,我看到了RegularExpressionAttribute,我可以将其子类化并动态创建正则表达式,但想知道我是否遗漏了一些已经存在的东西。

Answer 不限于 .NET 框架。 3rd 方库甚至自定义代码都可以接受,但越接近标准(在这种情况下,即被广泛采用)越好。

谢谢

【问题讨论】:

  • 请注意,数据注释是注释。他们自己不会验证任何东西。您仍然需要真正尊重注释的代码才能使某些事情发生。这适用于任何不是属性设置器实际验证传入值的解决方案。
  • 如果 RegularExpressionAttribute 不能满足您的需求,您可以创建实现 IClientVaidatable 的自定义验证属性,这将为您提供客户端和服务器端验证 The Complete Guide To Validation In ASP.NET MVC 3 - Part 2
  • @StephenMuecke -- 请参阅我的自我回答。如果您将评论更改为答案,我将接受它。

标签: c# .net asp.net-mvc data-annotations


【解决方案1】:

在我的代码中我是这样使用的:

[Required]
[RegularExpression("GET|POST|PUT|PATCH|DELETE", ErrorMessage = "Only http method allowed.")]
public string method { get; set; }

注意:如果将空字符串传递给method 然后我使用[Required] 标签,它将不会显示错误消息。

【讨论】:

    【解决方案2】:

    您可以为此使用Remote Validation

    [System.Web.Mvc.Remote("Check", "yourModel",
                            HttpMethod = "POST",
                            ErrorMessage = "Username is not available.")]
    public string Name { set; get; }
    

    还有:

    public ActionResult Check(string name)
    {
         string[] names = {"name1", "name2", "name3"};//set of possible values
    
         //validate the string is one of a set of possible values
         if (names.Contains(name.ToLowerInvariant())) return Json(false);
         //...
         return Json(true);
    }
    

    您还可以使用AdditionalFields 获取或设置验证所需的其他字段。 AdditionalFields属性为字符串属性,可以为多个字段提供。

    【讨论】:

      【解决方案3】:

      看起来继承 RegularExpressionAttribute 是一条路线,或者就像 Steven Muecke 在评论中所说的那样从头开始构建我自己的路线。

      作为旁注,我最终出于其他原因进行了重构,不再需要注释。但是,当我遇到没有明显和直接解决方案的问题时,通常会出现这种情况。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-27
        • 1970-01-01
        • 1970-01-01
        • 2020-07-23
        • 1970-01-01
        相关资源
        最近更新 更多