【问题标题】:Cannot change parameter in C# WebApi async method无法更改 C# WebApi 异步方法中的参数
【发布时间】:2016-04-17 20:10:43
【问题描述】:

第一篇文章在这里。 我在 ASP.Net WebApi 中的默认参数有问题。当我在路由中没有年份和月份的请求时,它使用默认值“0”。但是当我尝试将这个默认值更改为实际日期时,它会保持“0”值。我尝试使用默认参数作为

int? year = null, int? month = null

但也不起作用。

控制器路由前缀

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

即使我尝试将年份设置为某个值,它也会保留默认值“0”。 以前是这样工作的,但现在不行了。我做错了吗?

编辑 1 我想通了,那一年和那一个月被锁定在这里,因为它是异步操作并且因为这部分:wallet.Expenses = wallet.Expenses.Where(e =&gt; e.Date.Month == month &amp;&amp; e.Date.Year == year &amp;&amp; e.Id == id).ToList();,但我仍然不明白这种锁定为什么以及如何工作。

【问题讨论】:

  • 请同时提供您正在使用的请求,以便我们更好地了解问题可能是什么。
  • 帖子已更新。有什么想法吗?
  • 但是当我尝试将这个默认值更改为实际日期时。你是怎么做到的?
  • 当调试器点击 if(year == 0) { year = DateTime.Now.Year; } 其中 DateTime.Now.Year 返回 int 时,“年”不会更新,其值 = 0。
  • 找到解决办法了吗?

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


【解决方案1】:

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){

});

或运行您的本地主机。在 fiddler 客户端中选择 get 方法并传递相同的 URL 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。

'但是当我尝试将这个默认值更改为实际日期时,它会保持“0”值'

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

【讨论】:

  • [Route("{id:int}/{year:int?}/{month:int?}")] 路由中的问号表示年月是可选参数。这是有目的的-当我没有通过所需的日期时,它会从本月返回带有费用的钱包。而且我不会尝试将整个 Date 传递给操作,只传递年份和月份的 int 值。问题是,年份和月份的默认值不能更改为 Action 中的其他值。它的奇怪行为。
猜你喜欢
  • 1970-01-01
  • 2017-04-23
  • 2015-06-25
  • 2016-08-04
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
相关资源
最近更新 更多