Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.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# 可以将ModelBinding与GET请求一起使用吗?_C#_Get_Model Binding - Fatal编程技术网

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

C# 可以将ModelBinding与GET请求一起使用吗?,c#,get,model-binding,C#,Get,Model Binding,我很好奇是否可以将通过GET请求传入的查询字符串绑定到模型 例如,如果GETurl是https://localhost:1234/Users/Get?age=30&status=created 是否可以在GET操作中将查询参数绑定到模型,如下所示: [HttpGet] public async Task<JsonResult> Get(UserFilter filter) { var age = filter.age; var status = filter.sta

我很好奇是否可以将通过
GET
请求传入的查询字符串绑定到
模型

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

是否可以在
GET
操作中将查询参数绑定到
模型
,如下所示:

[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; }
}
[HttpGet]
公共异步任务获取(UserFilter筛选器)
{
var age=filter.age;
var status=filter.status;
}
公共类用户筛选器
{
公共整数{get;set;}
公共字符串状态{get;set;}
}

我目前正在使用
ASP.NET MVC
,我已经做了很多搜索,但我能找到的只有
ASP.NET Web API
。他们建议使用
[FromUri]
属性,但这在MVC中是不可用的。

我刚刚测试了这个属性,它确实有效(至少在.net core 3.1中是这样)


您可以创建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
                                          };
        }
}

CustomApicController(从当前控制器继承)具有UserFilter属性,因此可以将值保留在那里。如果某些查询参数未随请求一起发送,您还可以添加空检查

最后,您可以装饰控制器方法

[HttpGet]
[UserFilter]
public async Task<JsonResult> Get() 
{
    var age = UserFilter.age;
    var status = UserFilter.status;
}
[HttpGet]
[用户过滤器]
公共异步任务Get()
{
var age=UserFilter.age;
var status=UserFilter.status;
}

谢谢-遗憾的是,这在.net 4.6.2中不可用
[HttpGet]
[UserFilter]
public async Task<JsonResult> Get() 
{
    var age = UserFilter.age;
    var status = UserFilter.status;
}