我有这个方法:
[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; }
}
答案 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仅适用于那种情况我相信(请随时纠正我)。