2014-11-19 6 views
0

У меня есть этот метод:TempData не проходящий объект

[HttpPost] 
public async Task<ActionResult> AddBookingCreditCard(TripViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     // do nothing right now 
    } 

    TempData["ccInfo"] = model.CcInfo; 
    return RedirectToAction("Book", new{ id = model.Trip.TripId, travellers = model.Travellers}); 
} 

В этом случае, model.CcInfo существует и содержит объект типа CcInfo. После RedirectToAction, этот метод называется:

[HttpGet] 
public async Task<ActionResult> Book(int id, int travellers) 
{ 
    var vm = new TripViewModel(); 
    vm.Travellers = travellers; 

    if (TempData["ccInfo"] != null) 
     vm.CcInfo = TempData["ccInfo"] as CcInfo; 

    // lot of code 

    return View("Index", vm); 
} 

Условный-оператор всегда терпит неудачу: TempDate [ «ccInfo»] равна нулю, в то время как он должен содержать мой объект.

Что я делаю неправильно?

EDIT: Класс CcInfo:

public class CcInfo 
{ 
    [Display(Name = "Name on Card"), Required] 
    public string CcName { get; set; } 

    [Display(Name = "Card Number"), DataType(DataType.CreditCard), Required] 
    public int CcNumber { get; set; } 

    [Display(Name = "Card CVV"), Required, Range(100, 999)] 
    public int CcCheck { get; set; } 
} 
+0

Являются ли оба метода в одном контроллере? – ankur

+0

Да, они! :) – Bv202

+0

Что такое поставщик состояния сеанса? TempData полагается на сеанс. – b2zw2a

ответ

1

Я попытался повторить свой вопрос, и я могу определить проблему.

Этот код отлично работает для меня:

public class FooController : Controller 
{ 
    public async Task<ActionResult> AddBookingCreditCard() 
    { 
     TempData["ccInfo"] = "Hell world"; 
     return RedirectToAction("Book", new { id = 1, travellers = 2 }); 
    } 

    [HttpGet] 
    public async Task<ActionResult> Book(int id, int travellers) 
    { 
     var vm = new object(); 

     if (TempData["ccInfo"] != null) 
     { 
      vm = new object(); 
     } 

     // lot of code 
     return new EmptyResult(); 
    } 
} 

Однако, если я изменю AddBookingCreditCard, чтобы получать только запросы POST:

[HttpPost] 
public async Task<ActionResult> AddBookingCreditCard() 

Тогда TempData словарь пуст.

Чтобы перерезать погоню, вам нужно использовать состояние сеанса для хранения элементов между запросами в вашем случае.

Я не помню точных данных, но я думаю, что TempData хорошо работает для ситуаций, когда вам нужно перенаправить на другое действие контроллера, но только в том случае, если он находится в запросе GET. Исходя из POST, а затем перенаправление на GET, похоже, очищает TempData до чистого листа, что имеет смысл, поскольку TempData для этого сценария только я верю (пожалуйста, не стесняйтесь меня поправить).

+0

Спасибо за ответ, но сеанс тоже не работает. Есть идеи? – Bv202

+0

У вас включено состояние сеанса в 'web.config'? например http://stackoverflow.com/questions/2620520/enabling-session-state-in-asp-net-mvc –

+0

Добавление этого в мой web.config дает мне «неизвестную» внутреннюю ошибку сервера. – Bv202