代码之家  ›  专栏  ›  技术社区  ›  Dev 404

您可以将ModelBinding与GET请求一起使用吗?

  •  0
  • Dev 404  · 技术社区  · 5 年前

    我很好奇是否可以绑定一个通过 GET 请求 Model .

    例如,如果 url为 https://localhost:1234/Users/Get?age=30&status=created

    有没有可能 得到 如下所示:

    [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中不可用。

    0 回复  |  直到 5 年前
        1
  •  1
  •   Joel Fleischman    5 年前

    我刚刚测试了这个,它确实可以工作(至少在.NETCore3.1中是这样)

    [HttpGet("test")]
            public IActionResult TestException([FromQuery]Test test)
            {
                return Ok();
            }
    
            public class Test
            {
                public int Id { get; set; }
                public string Yes { get; set; }
            }
    
        2
  •  0
  •   guxxo    5 年前

    例如

     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;
    }