【问题标题】:TempData not passing objectTempData 不传递对象
【发布时间】:2014-11-19 17:32:57
【问题描述】:

我有这个方法:

[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);
}

if 语句总是失败:TempDate["ccInfo"] 为空,而它应该包含我的对象。

我做错了什么?

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

【问题讨论】:

  • 这两种方法是否在同一个控制器中??
  • 你的会话状态提供者是什么? TempData 依赖于 Session。
  • 呃,不知道,所以我想我正在使用默认值..
  • 好的。 'TempData' 主要用于在两个不同的控制器之间传递数据。您可以将值放入 Session["ccInfo"] 以查看该值是否在两种方法中都持续存在...
  • 当您将model.CcInfo 添加到TempData 时,您是否检查过model.CcInfo 的值实际上不为空?

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


【解决方案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 仅适用于我相信的那种情况(请随时纠正我)。

【讨论】:

  • 感谢您的回答,但 Session 似乎也不起作用。有什么想法吗?
  • 您是否在web.config 中启用了会话状态?例如stackoverflow.com/questions/2620520/…
  • 将此添加到我的 web.config 会给我一个“未知”的内部服务器错误。
  • 好的,我已经解决了。它没有传递正确的数据,非常感谢!还有一个问题:我的 ValidationMessageFor 没有显示它应该显示的错误...
  • 抱歉打错了。我的意思是“现在”而不是“不”。所以它现在正在传递参数!我现在只有验证问题..
猜你喜欢
  • 1970-01-01
  • 2012-11-13
  • 2017-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
  • 2015-01-21
相关资源
最近更新 更多