Невозможно изменить параметр в асинхронном методе С# WebApi

первый пост здесь. У меня проблема с параметром по умолчанию в 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 => e.Date.Month == month && e.Date.Year == year && e.Id == id).ToList();, но я до сих пор не понимаю, почему и как работает эта блокировка.


person Robert G    schedule 13.01.2016    source источник
comment
Укажите также запрос, который вы используете, чтобы мы могли лучше понять, в чем именно может заключаться проблема.   -  person Matt Hensley    schedule 13.01.2016
comment
Пост обновлен. Любые идеи?   -  person Robert G    schedule 13.01.2016
comment
Но когда я пытаюсь изменить эти значения по умолчанию в действии на фактическую дату. Как ты сделал это ?   -  person Shyju    schedule 13.01.2016
comment
Когда отладчик достигает if(year == 0) { year = DateTime.Now.Year; }, где DateTime.Now.Year возвращает int, год не обновляется и его значение = 0.   -  person Robert G    schedule 13.01.2016
comment
Вы нашли решение?   -  person Mikhail_Sam    schedule 05.02.2018


Ответы (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 выберите метод получения и передайте тот же 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"

Ответ: Если вы попытаетесь передать фактическую дату, например 13.01.2016, она не будет принята и вместо этого будет считаться 0, поскольку у вас есть значения int для всех ваших параметров. Вы должны использовать тип данных DateTime, чтобы они работали.

person micronyks    schedule 13.01.2016
comment
[Route("{id:int}/{year:int?}/{month:int?}")] Знаки вопроса в маршрутизации означают, что год и месяц являются необязательными параметрами. Это сделано специально - когда я не прохожу требуемую дату, он возвращает кошелек с расходами за этот месяц. И я не пытаюсь передать всю дату действию, только значения int для года и месяца. Дело в том, что значения по умолчанию для года и месяца нельзя изменить на другое значение в действии. Его странное поведение. - person Robert G; 13.01.2016