ASP.NET MVC C # DataTypeAttribute для параметра - PullRequest
0 голосов
/ 06 февраля 2019

Я пытался использовать 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();
    }

Класс EmailAddressAttribute имеет AttributeTargets.Parameter, поэтому я подумал, что он будет работать так же.

Может кто-нибудь подтвердить, так ли это на самом деле?Или есть способ заставить его работать так же, как модель?

РЕДАКТИРОВАТЬ: Я использую .NET Framework 4.6.2.

Спасибо

1 Ответ

0 голосов
/ 06 февраля 2019

Я не знаю, можно ли использовать DataTypeAttributes в качестве параметров в функции.Но как простой способ просто проверить, является ли это действительной нотацией электронной почты, вы можете использовать этот код:

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

РЕДАКТИРОВАТЬ 1:

Как уже упоминалосьот Mark Vincze здесь в своем блоге, вы можете создать новый 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 был создан, чтобы упростить проверку, является ли входящая привязка действительной или нет, а не только для проверки случайных объектов. Здесь - больше об этом.

Так что в вашем случае, когда AddEmail является «нормальным» методом, а не Action, вы не должны его использовать.В этом случае используйте другой метод проверки, такой как мой первый ответ.

И если вы хотите узнать больше о проверке, посмотрите на это сообщение в блоге Брэда Уилсона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...