Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在.Net核心API中的自定义操作筛选器中传递模型_C#_Validation_Asp.net Core Webapi_Action Filter - Fatal编程技术网

C# 如何在.Net核心API中的自定义操作筛选器中传递模型

C# 如何在.Net核心API中的自定义操作筛选器中传递模型,c#,validation,asp.net-core-webapi,action-filter,C#,Validation,Asp.net Core Webapi,Action Filter,这是我的控制器。在执行操作方法之前,我需要验证输入参数。操作方法接受Json对象,但在方法内部,我们将其转换为模型对象。是否可以在我的自定义操作筛选器中验证作为模型对象的输入?ValidateParamFilterAttribute是我的自定义筛选器类,它应该接受动作方法作为参数。它应该是泛型的,所以我不需要对我应用程序中的每个动作方法重复它 public class InputValidationController : ApiController { [HttpPo

这是我的控制器。在执行操作方法之前,我需要验证输入参数。操作方法接受Json对象,但在方法内部,我们将其转换为模型对象。是否可以在我的自定义操作筛选器中验证作为模型对象的输入?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; }
    }
是否可以在自定义操作筛选器中将输入作为模型对象进行验证

如果您希望根据收到的action argument
testdata
的值生成模型类
Users
的实例,并在action filter中手动执行模型验证,则可以参考以下代码段

操作过滤器的OnAction执行方法

UsersController和SaveData操作

测试结果

1) 无效

2) 有效的

是否可以在自定义操作筛选器中将输入作为模型对象进行验证

如果您希望根据收到的action argument
testdata
的值生成模型类
Users
的实例,并在action filter中手动执行模型验证,则可以参考以下代码段

操作过滤器的OnAction执行方法

UsersController和SaveData操作

测试结果

1) 无效

2) 有效的


关于这个案例有什么更新吗?你达到要求了吗?关于这个案例有什么更新吗?你达到要求了吗?而是阅读每个属性并创建对象。您可以使用JObject.ToObject();我对这个答案投了赞成票,因为它让我找到了TryValidateModel(),这正是我在寻找对来自JObject的反序列化对象应用模型验证的东西,非常感谢。而不是阅读每个属性并创建对象。您可以使用JObject.ToObject();我对这个答案投了赞成票,因为它让我找到了TryValidateModel(),这正是我在寻找对来自JObject的反序列化对象应用模型验证的东西,非常感谢。
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
        //...
[ApiController]
public class UsersController : ControllerBase
{
    [HttpPost("SaveData")]
    [ValidateParamFilter(typeof(Users))]
    public IActionResult SaveData([FromBody]JObject testdata)
    {
        //...