Web Api 2 - 填充复杂查询字符串参数的默认值

jkr*_*r01 6 c# asp.net asp.net-web-api2

我正在使用 ASP.Net Web API 2 构建 REST API。我有一个 GET 端点,它接受查询字符串中的复杂对象。

public async Task<IHttpActionResult> GetAsync([FromUri]SpendingAccountSearchParams spendingAccountSearchParams) {...}
Run Code Online (Sandbox Code Playgroud)

搜索对象有很多属性,这些属性要么可以为空,要么在对象的构造函数中填充默认值。例如:

public SpendingAccountSearchParams()
{
    AsOfDate = DateTime.Now;
    Skip = 0;
    Top = 20;
}
Run Code Online (Sandbox Code Playgroud)

如果我在查询字符串中传递至少 1 个参数,则我的 SpendingAccountSearchParams 对象将填充到控制器中,并且所有默认值都会正确设置。

但是,如果我不传递任何值,那么我的 SpendingAccountSearchParams 对象在构造函数中为 null。

如果没有传递查询字符串参数,如何自动强制所有属性获取默认值?

我想要与此等效的内容,但显然它无效并且不起作用:

public async Task<IHttpActionResult> GetAsync([FromUri]SpendingAccountSearchParams? spendingAccountSearchParams = new SpendingAccountSearchParams()) {...}
Run Code Online (Sandbox Code Playgroud)

我知道在控制器中我可以检查 null 并创建一个新对象(如果它不存在),但这只是一个端点的一个示例。最终,我将拥有许多具有不同搜索参数的端点,并且我希望所有端点都能自动发生。

任何帮助,将不胜感激。

谢谢!

小智 5

由于某种原因,如果您使用 getter/setter 而不是属性,它可以开箱即用。

public SpendingAccountSearchParams()
{
    DateTime AsOfDate { get; set; } = DateTime.Now;
    int Skip { get; set; } = 0;
    int Top { get; set; } = 20;
}
Run Code Online (Sandbox Code Playgroud)


E2r*_*abi 0

你可以试试这个代码

     public async Task<IHttpActionResult> GetAsync([FromUri]SpendingAccountSearchParams spendingAccountSearchParams){
     if(spendingAccountSearchParams==null)
      {
         spendingAccountSearchParams.AsOfDate=DateTime.Now;
    spendingAccountSearchParams.Skip=0;
    spendingAccountSearchParams.Top=20;
     }
    else
    {
     // your code

    }
}
Run Code Online (Sandbox Code Playgroud)