Webapi 动态验证

Posted

技术标签:

【中文标题】Webapi 动态验证【英文标题】:Webapi dynamic validations 【发布时间】:2020-02-10 12:29:08 【问题描述】:

我希望根据数据库中的值来验证特定请求。这是一个复杂的场景,但我会尝试在一个示例中对其进行简化。

假设我有以下模型:

public class EventDataForms

    public int Field_ID  get; set; 
    public string Field_Type  get; set; 

    public string Field_data_Type  get; set; 

    public int Field_Min_Length  get; set; 
    public int Field_Max_Length  get; set; 


    public string Field_Name  get; set; 


    public string Field_Description  get; set; 
    public int Field_Order  get; set; 
    public Boolean Required_flag  get; set; 
    public int Event_Form_ID  get; set; 
    public int CategoryID  get; set; 
    public int Event_ID  get; set; 
    public DateTime Created_Date  get; set; 
    public string Created_by  get; set; 
    public string Options  get; set; 


当一个 POST 请求进来时,我需要进行调用以获得传递的 Field_Name 的某些要求

Field_data_Type = 'String'

Field_Name = '名字';

Field_data_Type = 'String'

>Field_Name = 'Last Name';


Field_data_Type = 'Email'

Field_Name = '电子邮件';

Field_data_Type = 'String'

Field_Name = '性别';

Field_data_Type = 'numeric'

Field_Name = '年龄';

Field_data_Type = 'String'

Field_Name = '你的 T 恤尺码是多少';

Field_data_Type = 'numeric'

Field_Name = '电话号码';

Field_data_Type = 'numeric'

Field_Name = '邮编';

Field_data_Type = 'String'

Field_Name = '街道地址';

Field_data_Type = 'String'

Field_Name = '国家';

Field_data_Type = 'String'

Field_Name = '状态';

我想要对这些字段进行动态验证..有人可以帮我吗?

【问题讨论】:

【参考方案1】:

MVC 有一个钩子来提供你自己的 ModelValidatorProvider。默认情况下,MVC 2 使用 ModelValidatorProvider 的一个子类,称为 DataAnnotationsModelValidatorProvider,它能够使用 System.DataAnnotations.ComponentModel.ValidationAttribute 属性进行验证。

DataAnnotationsModelValidatorProvider 使用反射来查找所有 ValidationAttributes 并简单地遍历集合以验证您的模型。您需要做的就是覆盖一个名为 GetValidators 的方法,并从您选择的任何来源注入您自己的属性。我使用这种技术进行约定验证,具有 DataType.Email 属性的属性总是通过正则表达式传递,并使用这种技术从数据库中提取信息,以对“非超级”用户应用更严格的验证。

下面的例子简单地说“总是需要任何 FirstName 属性”。

public class CustomMetadataValidationProvider : DataAnnotationsModelValidatorProvider

 protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable<Attribute> attributes)

    //go to db if you want
    //var repository = ((MyBaseController) context.Controller).RepositorySomething;

    //find user if you need it
    var user = context.HttpContext.User;

    if (!string.IsNullOrWhiteSpace(metadata.PropertyName) && metadata.PropertyName == "FirstName")
        attributes = new List<Attribute>() new RequiredAttribute();

    return base.GetValidators(metadata, context, attributes);
 

您所要做的就是在您的 Global.asax.cs 文件中注册提供程序:

protected void Application_Start()

    ModelValidatorProviders.Providers.Add(new CustomMetadataValidationProvider());

    AreaRegistration.RegisterAllAreas();

    RegisterRoutes(RouteTable.Routes);

【讨论】:

以上是关于Webapi 动态验证的主要内容,如果未能解决你的问题,请参考以下文章

WebApi实现验证授权Token,WebApi生成文档等

WebApi实现验证授权Token,WebApi生成文档等(转)

WebApi实现验证授权Token,WebApi生成文档等 - CSDN博客

WebApi验证

ABP动态生成WebAPI

WebApi身份验证