C# 操作中所有参数的BindRequired属性
在控制器操作中,当您向参数添加属性[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; }
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相反,我希望类似的内容调用操作的所有参数,而不将其添加到每个操作。类似于一个属性,它的作用相同,但应用于动作。