代码之家  ›  专栏  ›  技术社区  ›  Murphybro2

ASP.NET参数上的MVC C#DataTypeAttribute

  •  0
  • Murphybro2  · 技术社区  · 7 年前

    我试过用 EmailAddressAttribute 对发布到控制器的参数,但其效果与在模型中使用时的效果不同。

    这是我的代码:

        public void AddEmail(int id, [EmailAddress]string emailAddress)
        {
            if (!ModelState.IsValid)
                throw new Exception();
        }
    

    这个 emailAddress 参数在 ModelState

        public class TestModel
        {
            public int Id { get; set; }
            [EmailAddress]
            public string EmailAddress { get; set; }
        }
    
        public void AddEmail(TestModel model)
        {
            if (!ModelState.IsValid)
                throw new Exception();
        }
    

    电子邮件地址属性 类具有 AttributeTargets.Parameter 所以我认为它也会起到同样的作用。

    编辑:我使用的是.NETFramework4.6.2。

    1 回复  |  直到 7 年前
        1
  •  0
  •   bene_rawr    7 年前

    我不知道你能不能用 DataTypeAttributes 但作为一种简单的方法来检查它是否是有效的电子邮件标记,您可以使用以下代码:

    try {
        var addr = new System.Net.Mail.MailAddress(email);
        return addr.Address == email;
    }
    catch {
        return false;
    }
    

    编辑1:

    正如马克·文斯所说 here 在他的博客上,你可以创造一个新的 ActionFilterAttribute 当你想在你的动作参数中有属性的时候。

    public class ValidateActionParametersAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            var descriptor = context.ActionDescriptor as ControllerActionDescriptor;
    
            if (descriptor != null)
            {
                var parameters = descriptor.MethodInfo.GetParameters();
    
                foreach (var parameter in parameters)
                {
                    var argument = context.ActionArguments[parameter.Name];
    
                    EvaluateValidationAttributes(parameter, argument, context.ModelState);
                }
            }
    
            base.OnActionExecuting(context);
        }
    
        private void EvaluateValidationAttributes(ParameterInfo parameter, object argument, ModelStateDictionary modelState)
        {
            var validationAttributes = parameter.CustomAttributes;
    
            foreach (var attributeData in validationAttributes)
            {
                var attributeInstance = CustomAttributeExtensions.GetCustomAttribute(parameter, attributeData.AttributeType);
    
                var validationAttribute = attributeInstance as ValidationAttribute;
    
                if (validationAttribute != null)
                {
                    var isValid = validationAttribute.IsValid(argument);
                    if (!isValid)
                    {
                        modelState.AddModelError(parameter.Name, validationAttribute.FormatErrorMessage(parameter.Name));
                    }
                }
            }
        }
    }
    

    Actions . 因为 ModelState -类的创建是为了使检查 传入绑定 是否有效,而不仅仅是验证随机对象。 Here 更重要的是。

    AddEmail 是“正常”方法而不是 Action

    如果你想了解更多关于验证的内容,可以看看 this 布拉德·威尔逊的博客文章。