我尝试在发布到控制器的参数上使用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。
谢谢
答案 0 :(得分:0)
我不知道您是否可以在功能中使用DataTypeAttributes
作为参数。
但是,作为一种简单的方法来检查它是否为有效的电子邮件符号,您可以使用以下代码:
try {
var addr = new System.Net.Mail.MailAddress(email);
return addr.Address == email;
}
catch {
return false;
}
编辑1:
正如Mark Vincze 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
,则不应使用此方法。在这种情况下,请使用其他验证方法,例如我的第一个答案。
如果您想进一步了解验证,请看Brad Wilson的this博客文章。