C# 操作中所有参数的BindRequired属性

C# 操作中所有参数的BindRequired属性,c#,asp.net-core,.net-core,asp.net-core-webapi,C#,Asp.net Core,.net Core,Asp.net Core Webapi,在控制器操作中,当您向参数添加属性[BindRequired]时,它使参数成为必需的。但是如果你有多个参数,它会变得非常冗长。有没有一种方法可以在操作级别上实现类似的功能?一种方法是创建一个模型,并将所有参数放入模型中,如下所示: public class Test { [BindRequired] public string Id { get; set; } [BindRequired] public string Name { get; set; }

在控制器操作中,当您向参数添加属性[BindRequired]时,它使参数成为必需的。但是如果你有多个参数,它会变得非常冗长。有没有一种方法可以在操作级别上实现类似的功能?

一种方法是创建一个模型,并将所有参数放入模型中,如下所示:

public class Test
{
    [BindRequired]
    public string Id { get; set; }
    [BindRequired]
    public string Name { get; set; }
    //other property...
}
public class MyActionFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        var keylist = new string[] { "id", "name" };
        var keys = context.HttpContext.Request.Query.Keys;
        foreach(var item in keylist)
        {
            if(!keys.Contains(item))
            {
                context.ModelState.AddModelError(item, $"The {item} need to be provided");
            }
        }
        if (!context.ModelState.IsValid)
        {
            context.Result = new BadRequestObjectResult(
                                                context.ModelState);
        }
    }

}
控制器:

public void Post([FromQuery] Test model)
{
     // return statement
}
[HttpPost]
[MyActionFilter]
public void Post(string id,string name)
{
    // return statement
}
请求url:
https://localhost:portNumber/api/values?id=1&name=aa

另一种方法是自定义操作筛选器,如下所示:

public class Test
{
    [BindRequired]
    public string Id { get; set; }
    [BindRequired]
    public string Name { get; set; }
    //other property...
}
public class MyActionFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        var keylist = new string[] { "id", "name" };
        var keys = context.HttpContext.Request.Query.Keys;
        foreach(var item in keylist)
        {
            if(!keys.Contains(item))
            {
                context.ModelState.AddModelError(item, $"The {item} need to be provided");
            }
        }
        if (!context.ModelState.IsValid)
        {
            context.Result = new BadRequestObjectResult(
                                                context.ModelState);
        }
    }

}
控制器:

public void Post([FromQuery] Test model)
{
     // return statement
}
[HttpPost]
[MyActionFilter]
public void Post(string id,string name)
{
    // return statement
}

一种方法是创建模型并将所有参数放入模型,如下所示:

public class Test
{
    [BindRequired]
    public string Id { get; set; }
    [BindRequired]
    public string Name { get; set; }
    //other property...
}
public class MyActionFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        var keylist = new string[] { "id", "name" };
        var keys = context.HttpContext.Request.Query.Keys;
        foreach(var item in keylist)
        {
            if(!keys.Contains(item))
            {
                context.ModelState.AddModelError(item, $"The {item} need to be provided");
            }
        }
        if (!context.ModelState.IsValid)
        {
            context.Result = new BadRequestObjectResult(
                                                context.ModelState);
        }
    }

}
控制器:

public void Post([FromQuery] Test model)
{
     // return statement
}
[HttpPost]
[MyActionFilter]
public void Post(string id,string name)
{
    // return statement
}
请求url:
https://localhost:portNumber/api/values?id=1&name=aa

另一种方法是自定义操作筛选器,如下所示:

public class Test
{
    [BindRequired]
    public string Id { get; set; }
    [BindRequired]
    public string Name { get; set; }
    //other property...
}
public class MyActionFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        var keylist = new string[] { "id", "name" };
        var keys = context.HttpContext.Request.Query.Keys;
        foreach(var item in keylist)
        {
            if(!keys.Contains(item))
            {
                context.ModelState.AddModelError(item, $"The {item} need to be provided");
            }
        }
        if (!context.ModelState.IsValid)
        {
            context.Result = new BadRequestObjectResult(
                                                context.ModelState);
        }
    }

}
控制器:

public void Post([FromQuery] Test model)
{
     // return statement
}
[HttpPost]
[MyActionFilter]
public void Post(string id,string name)
{
    // return statement
}

是否要避免将BindRequired属性写入到调用列中?@SatishPai相反,我希望这样做可以调用操作的所有参数,而不必将其添加到每个操作中。类似于一个属性,其作用相同,但应用于操作。是否要避免将BindRequired属性写入调用列?@SatishPai相反,我希望类似的内容调用操作的所有参数,而不将其添加到每个操作。类似于一个属性,它的作用相同,但应用于动作。