如何解决您可以将ModelBinding与GET请求一起使用吗?
我很好奇是否可以将通过GET
请求传入的查询字符串绑定到Model
。
例如,如果GET
网址为https://localhost:1234/Users/Get?age=30&status=created
是否可以通过GET
操作将查询参数绑定到Model
,如下所示:
[HttpGet]
public async Task<JsonResult> Get(UserFilter filter)
{
var age = filter.age;
var status = filter.status;
}
public class UserFilter
{
public int age { get; set; }
public string status { get; set; }
}
我目前正在使用ASP.NET MVC
,并且已经做了很多搜索工作,但是我唯一能找到的与ASP.NET Web API
有关。他们建议使用[FromUri]
属性,但这在MVC中不可用。
解决方法
我刚刚对此进行了测试,并且它确实有效(至少在.net core 3.1中)
[HttpGet("test")]
public IActionResult TestException([FromQuery]Test test)
{
return Ok();
}
public class Test
{
public int Id { get; set; }
public string Yes { get; set; }
}
,
您可以创建一个ActionFilterAttribute,在其中将解析查询参数,并将其绑定到模型。然后,您可以使用该属性装饰控制器方法。 例如
public class UserFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
var controller = actionContext.ControllerContext.Controller as CustomApiController;
var queryParams = actionContext.Request.GetQueryNameValuePairs();
var ageParam = queryParams.SingleOrDefault(a => a.Key == "age");
var statusParam = queryParams.SingleOrDefault(a => a.Key == "status");
controller.UserFilter = new UserFilter {
Age = int.Parse(ageParam.Value),Status = statusParam.Value
};
}
}
CustomApiController(继承自当前控制器),并且具有UserFilter属性,因此您可以将值保留在那里。您还可以添加空检查,以防某些查询参数未随请求一起发送。
最后,您可以装饰控制器方法
[HttpGet]
[UserFilter]
public async Task<JsonResult> Get()
{
var age = UserFilter.age;
var status = UserFilter.status;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。