在.netcore Web API项目中的Web API调用中将空值传递给可为空的属性时出现问题

err*_*ler 1 model-binding asp.net-core-mvc .net-core asp.net-core-webapi

我在HttpGet动词中将空参数值传递给模型的属性时遇到问题。

我将.Net Core 2.1用于我的Web API项目。下面是我在控制器中的操作方法:

    [HttpGet("get")]
    public ActionResult GetData([FromQuery]MyTestModel model)
    {
        var result = new MyTestModel();
        return new JsonResult(result);
    }
Run Code Online (Sandbox Code Playgroud)

我的MyTestModel.cs就像:

 [Serializable]
public class MyTestModel
{
    public MyTestModel()
    {
        PageNo = 1;
        PageSize = 10;
    }
    public int ClientId { get; set; }
    public int? CandidateId { get; set; }
    public DateTime? FromDate { get; set; }
    public DateTime? ToDate { get; set; }
    public int PageNo { get; set; }
    public int PageSize { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当我像这样调用API时:

api/controller/get?clientId=7583&candidateId=null&fromDate=null&toDate=null
Run Code Online (Sandbox Code Playgroud)

我得到400条回复。以下是响应消息:

{"toDate":["The value 'null' is not valid for ToDate."],
 "fromDate":["The value 'null' is not valid for FromDate."],
 "candidateId":["The value 'null' is not valid for CandidateId."]
}
Run Code Online (Sandbox Code Playgroud)

当我根本不发送任何可为空的属性时(candidateId,fromDate,toDate),这将触发我的操作并将默认值用作null。

如果我尝试显式设置null值,那会是什么问题?

我是否需要在Startup.cs中设置一些配置以处理可为空的属性的空值?

任何帮助将不胜感激 。

提前致谢。

Chr*_*att 6

查询字符串中发送的所有内容都只是一个字符串。因此,当您执行类似的操作时toDate=null,您实际上是在说“设置toDate"null"”,即字符串 “ null”。modelbinder尝试将所有字符串转换为您要绑定到的实际类型,但是没有可用的转换可以"null"转换为null DateTime

要将值设置为null,您无需传递任何值,toDate=或者仅从查询字符串中完全省略键。