这是我的控制器,我需要在动作方法被执行之前验证输入参数,动作方法接受Json对象,但在方法内部我们将把它转换为模型对象,是否可以在我的自定义动作过滤器中验证输入为Model对象? ValidateParamFilterAttribute是我的自定义过滤器类,它应该接受动作方法作为参数,它应该是通用的,所以我不需要为我的应用程序中的每个动作方法重复它。
public class InputValidationController : ApiController
{
[HttpPost][ValidateParamFilter(typeof(Users))]
public string SaveData([FromBody]JObject testdata )
{
}
}
我的自定义动作过滤器。
public class ValidateParamFilterAttribute: Attribute , IActionFilter
{
public ValidateParamFilterAttribute(Type type) {
//not able to proceed here
// the type parameter will take my modal classes.in this case it should be Users
}
public override void OnActionExecuting(HttpActionContext actionContext)
{
}
}
模型类。
public class Users
{
[Required(ErrorMessage ="Id field is mandatory")]
public int id { get; set; }
[Required][StringLength(10,ErrorMessage ="Name length can't be more than 10")]
public string Name { get; set; }
[Required][Phone][MaxLength(10)]
public string PhoneNumber { get; set; }
[Required][EmailAddress]
public string Email { get; set; }
}
是否可以在我的自定义动作过滤器中验证输入为模型对象?
如果你想生成一个你的模型类的实例,那么你可以用以下方法来实现 Users
根据行动参数的接收值 testdata
以及在动作过滤器中手动进行模型验证,可以参考以下代码片段。
动作过滤器的OnActionExecuting方法。
public void OnActionExecuting(ActionExecutingContext context)
{
var jobj = context.ActionArguments["testdata"] as JObject;
var users = new Users
{
id = (int)jobj["id"],
Name = (string)jobj["name"],
PhoneNumber = (string)jobj["phoneNumber"],
Email = (string)jobj["email"]
};
var isvalid = (context.Controller as UsersController).TryValidateModel(users, nameof(Users));
if (!isvalid)
{
//...
//code logic here
//...
UsersController和SaveData动作
[ApiController]
public class UsersController : ControllerBase
{
[HttpPost("SaveData")]
[ValidateParamFilter(typeof(Users))]
public IActionResult SaveData([FromBody]JObject testdata)
{
//...
测试结果
1) 无效
2)有效