无法在C#WebApi异步方法中更改参数

时间:2016-01-13 01:10:04

标签: asp.net-web-api asp.net-mvc-5 asp.net-web-api2 default-parameters

首先发布在这里。 我在ASP.Net WebApi中遇到默认参数问题。当我在路线中没有年份和月份的情况下执行请求时,它使用默认值" 0"。但是,当我尝试将此默认值更改为实际日期时,它会保留" 0"值。我尝试使用默认参数

int? year = null, int? month = null

但也不起作用。

Controller RoutePrefix

[RoutePrefix("api/Wallets")]

实际行动

[Route("{id:int}/{year:int?}/{month:int?}")]
[HttpGet]
[ResponseType(typeof(Wallet))]
public async Task<IHttpActionResult> GetWallet(int id, int year = 0, int month = 0)
{
    var userId = User.Identity.GetUserId();

    Wallet wallet = await db.Wallets.FindAsync(id);
    if (wallet == null)
    {
        return NotFound();
    }
    if (wallet.UserId != userId)
    {
        return Unauthorized();
    }

    if(year == 0)
    {
        year = DateTime.Now.Year;
    }

    if(month == 0)
    {
        month = DateTime.Now.Month;
    }

    wallet.Expenses = wallet.Expenses.Where(e => e.Date.Month == month && e.Date.Year == year).ToList();

    return Ok(wallet);
}

请求

http://localhost:xxxx/api/Wallets/16

具体而言,只有这不起作用:

if(year == 0)
{
    year = DateTime.Now.Year;
}

if(month == 0)
{
    month = DateTime.Now.Month;
}

即使我尝试将年份设置为某个值,它也会保留默认值&#34; 0&#34;。 它之前的工作方式如此,但现在还没有。我做错了吗?

修改1 我想通了,那个年和月被锁定在这里因为它的异步动作而且因为这个部分:wallet.Expenses = wallet.Expenses.Where(e => e.Date.Month == month && e.Date.Year == year && e.Id == id).ToList();,但我仍然不明白为什么以及如何锁定这个。

1 个答案:

答案 0 :(得分:0)

http://localhost:xxxx/api/Wallets/16 这不起作用,因为您只传递一个参数的Id = 16的值,或者请求本身会考虑Id = 16。

您需要传递三个值。

AngularService.GetWallet('http://localhost:xxxx/api/Wallets?id=1&year=2016&month=1').sucess(function(data,status){

}).error(function(data,status){

});

或运行您的localhost。在fiddler客户端中选择get方法并传递相同的网址 http://localhost:xxxx/api/Wallets?id=1&year=2016&month=1 它将与传递的值匹配相同的API。

或者运行localhost。在浏览器的地址栏中粘贴 http://localhost:xxxx/api/Wallets?id=1&year=2016&month=1 ,它会与传递的值匹配相同的API。

&#39;但是当我尝试将此默认值更改为实际日期时,它会保留&#34; 0&#34;值&#39;

答案:如果您尝试传递实际日期(例如2016年1月13日),它将不会接受它并考虑0,因为您拥有所有参数的int值。您必须使用DateTime数据类型才能使用它们。