如何在.Net核心API的自定义动作过滤器中传递模型?

问题描述 投票:0回答:1

这是我的控制器,我需要在动作方法被执行之前验证输入参数,动作方法接受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; }
    }
c# validation asp.net-core-webapi action-filter
1个回答
0
投票

是否可以在我的自定义动作过滤器中验证输入为模型对象?

如果你想生成一个你的模型类的实例,那么你可以用以下方法来实现 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) 无效

enter image description here

2)有效

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.