Невозможно перенаправить к действию при использовании TempData в Asp.Net Core

Я пытаюсь добиться простой вещи в Asp.Net Core. В Asp.Net Mvc это не было бы большой проблемой. У меня есть такой метод действий

public async Task<IActionResult> Create([Bind("Id,FirstName,LastName,Email,PhoneNo")] Customer customer)
    {
        if (ModelState.IsValid)
        {
            _context.Add(customer);
            await _context.SaveChangesAsync();
            TempData["CustomerDetails"] = customer;
            return RedirectToAction("Registered");
        }
        return View(customer);
    }

public IActionResult Registered()
    {
        Customer customer = (Customer)TempData["CustomerDetails"];
        return View(customer);
    }

Сначала я предполагал, что TempData работает по умолчанию, но позже понял, что его нужно добавить и настроить. Я добавил ITempDataProvider в автозагрузку. Официальный документ, кажется, описывает, что этого должно быть достаточно. Это не сработало. Затем я также настроил его для использования сеанса

public void ConfigureServices(IServiceCollection services)
{
      services.AddMemoryCache();
      services.AddSession(
            options => options.IdleTimeout= TimeSpan.FromMinutes(30)
            );
      services.AddMvc();
      services.AddSingleton<ITempDataProvider,CookieTempDataProvider>();
}

Следующая строка относится к методу Session in Configure Startup перед написанием app.UseMvc.

app.UseSession();

Это все еще не работает. Что происходит, я больше не получаю никаких исключений из-за использования TempData, которые у меня были раньше, когда я пропустил некоторую конфигурацию, но теперь метод действия create не может перенаправить на зарегистрированный метод. Метод Create выполняет всю работу, но RedirectToAction не имеет никакого эффекта. Если я удалю строку, которая назначает сведения о клиенте для TempData, RedirectToAction успешно перенаправляется на этот метод действия. Однако в этом случае метод зарегистрированного действия, очевидно, не имеет доступа к CustomerDetails. Что мне не хватает?


person Hem Acharya    schedule 23.03.2017    source источник
comment
Не могли бы вы попробовать сериализацию и десериализацию JSON - TempData["CustomerDetails"] = JsonConvert.SerializeObject(customer); и var customer = JsonConvert.DeserializeObject<Customer>((TempData["CustomerDetails"] ?? "").ToString());?   -  person Win    schedule 23.03.2017
comment
Что ж. Я использую серверные TempData, а не файлы cookie. Я не думаю, что для этой цели нам нужно сериализовать в JSON.   -  person Hem Acharya    schedule 23.03.2017
comment
Очевидно, мы все это знаем. Поскольку мы не могли видеть, что находится внутри класса Customer, я хочу увидеть, не работают ли TempData или сами данные недопустимы для сериализации в TempData.   -  person Win    schedule 23.03.2017


Ответы (1)


@Выиграть. Ты был прав. Я понял, что сериализация, десериализация требуется всякий раз, когда вы хотите использовать TempData в Asp.net Core после прочтения заявления об отказе от ответственности в этой статье.

https://andrewlock.net/post-redirect-get-using-tempdata-in-asp-net-core/

Сначала я попытался использовать BinaryFormatter, но обнаружил, что он также был удален из .NET Core. Затем я использовал NewtonSoft.Json для сериализации и десериализации.

TempData["CustomerDetails"] = JsonConvert.SerializeObject(customer);

public IActionResult Registered()
    {
        Customer customer = JsonConvert.DeserializeObject<Customer>(TempData["CustomerDetails"].ToString());
        return View(customer);
    }

Это дополнительная работа, которую мы должны сделать сейчас, но похоже, что так оно и есть сейчас.

person Hem Acharya    schedule 23.03.2017