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生成文档等(转)