2010-04-26 34 views
5

我正在使用数据批注在ASP.NET MVC中验证我的模型。这适用于具有复杂参数的操作方法,例如,是否可以使用数据注释来验证传递给Controller的Action方法的参数?

public class Params 
{ 
    [Required] string Param1 {get; set;} 
    [StringLength(50)] string Param2 {get; set;} 
} 


ActionResult MyAction(Params params) 
{ 
    If(ModeState.IsValid) 
    { 
     // Do Something 
    } 
} 

如果我想将单个字符串传递给Action方法(如下所示),该怎么办。有没有办法使用数据注释,或者我将不得不将字符串包装到类中?

ActionResult MyAction(string param1, string param2) 
{ 
    If(ModeState.IsValid) 
    { 
    // Do Something 
    } 
} 

回答

1

我不相信有一个数据注释方法,你正在提议。但是,如果您希望在调用操作方法之前进行验证,请考虑向该参数添加自定义模型绑定器属性,并指定要使用的特定模型绑定器。

例子:

public ActionResult MyAction [ModelBinder(typeof(StringBinder)] string param1, [ModelBinder(typeof(StringBinder2)] string param2) 
{ 
    ......... 
} 
+2

而且让简单的解决方案与视图模型...我相信,没有必要寻找其他的。 – LukLed 2010-04-26 22:11:27

1

创建自己的模型......

public class Params 
{ 
    [Required] string param1 {get; set;} 
    [StringLength(50)] string param2 {get; set;} 
} 

,改变你的服务器端控制器的签名:

[HttpGet] 
ActionResult MyAction([FromUri] Params params) 
{ 
    If(ModeState.IsValid) 
    { 
     // Do Something 
    } 
} 

如果您的客户端代码已工作你不必改变它...请注意,你的模型的属性是一样的pa rameter你现在正在传递(string param1, string param2)...他们是区分大小写的...

编辑: 我的意思是,你可以打电话给你的控制器以这样的方式

http://localhost/api/values/?param1=xxxx&param2=yyyy

0

随着ActionFilterAttribute可以在操作参数上使用DataAnnotation。这使您能够做这样的事情:

ActionResult MyAction([Required] string param1, [StringLength(50)] string param2) 
{ 
    If(ModeState.IsValid) 
    { 
    // Do Something 
    } 
} 

见这里的解决方案:https://blog.markvincze.com/how-to-validate-action-parameters-with-dataannotation-attributes/

它使用一个动作过滤器通过查询的所有动作参数并对其执行数据的注释(如果有任何)。


编辑:上述解决方案仅适用于.NET的核心。我做了一个稍微修改版本,在.NET框架4.5的工作(可能工作在老版本)

public class ValidateActionParametersAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext context) 
    { 
     var parameters = context.ActionDescriptor.GetParameters(); 

     foreach (var parameter in parameters) 
     { 
      var argument = context.ActionArguments[parameter.ParameterName]; 

      EvaluateValidationAttributes(parameter, argument, context.ModelState); 
     } 

     base.OnActionExecuting(context); 
    } 

    private void EvaluateValidationAttributes(HttpParameterDescriptor parameter, object argument, ModelStateDictionary modelState) 
    { 
     var validationAttributes = parameter.GetCustomAttributes<ValidationAttribute>(); 

     foreach (var validationAttribute in validationAttributes) 
     { 
      if (validationAttribute != null) 
      { 
       var isValid = validationAttribute.IsValid(argument); 
       if (!isValid) 
       { 
        modelState.AddModelError(parameter.ParameterName, validationAttribute.FormatErrorMessage(parameter.ParameterName)); 
       } 
      } 
     } 
    } 
} 
0
  1. 创建自己的过滤器属性:

    public class ActionParameterValidationAttribute : ActionFilterAttribute 
    { 
        public override void OnActionExecuting(HttpActionContext actionContext) 
        { 
         actionContext 
          .ActionDescriptor 
          .GetParameters() 
          .SelectMany(p => p.GetCustomAttributes<ValidationAttribute>().Select(a => new 
          { 
           IsValid = a.IsValid(actionContext.ActionArguments[p.ParameterName]), 
           p.ParameterName, 
           ErrorMessage = a.FormatErrorMessage(p.ParameterName) 
          })) 
          .Where(_ => !_.IsValid) 
          .ToList() 
          .ForEach(_ => actionContext.ModelState.AddModelError(_.ParameterName, _.ErrorMessage)); 
    
         if (!actionContext.ModelState.IsValid) 
         { 
          actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState); 
         } 
        } 
    } 
    
  2. 全球范围内使用它:

    new HttpConfiguration { Filters = { new ModelValidationAttribute() } }; 
    
相关问题