TempData不传递对象

时间:2014-11-19 08:46:34

标签: c# asp.net-mvc-3 asp.net-mvc-4

我有这个方法:

[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 DOES存在并包含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);
}

if语句总是失败:TempDate [&#34; ccInfo&#34;]为null,而它应该包含我的对象。

我做错了什么?

编辑: 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; }
}

1 个答案:

答案 0 :(得分: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仅适用于那种情况我相信(请随时纠正我)。