首先发布在这里。 我在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();
,但我仍然不明白为什么以及如何锁定这个。
答案 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数据类型才能使用它们。