使用 TempData 字典会阻止 RedirectToAction 工作

Using TempData dictionary prevents RedirectToAction from working

我想将视图模型添加到 TempData,以便像这样将它传递给另一个控制器(参考最后两行):

[HttpPost("register")]
public async Task<IActionResult> Register(RegisterViewModel rvm)
{
    if (ModelState.IsValid)
    {
        var result = await _authManager.RegisterUserAsync(rvm.FullName, rvm.Email, rvm.Password);

        if (result.IsSuccessful)
        {
            return RedirectToAction("Login", "Home", new { message = result.Message });
        }
        else
        {
            TempData["rvm"] = rvm;
            return RedirectToAction("Register", "Home");
        }
    }

    TempData["rvm"] = rvm;
    return RedirectToAction("Register", "Home");
}

问题是,执行此操作后,RedirectToAction 方法实际上不起作用,我得到的是空白页(url 也没有改变) .我补充说,没有 TempData 行,一切正常。

有什么建议我错了吗?

编辑:

Home/Register

[HttpGet("register")]
public IActionResult Register()
{
    RegisterViewModel rvm = (RegisterViewModel)TempData["rvm"];
    return View(rvm);
}

这不是一个很好的答案,但我遇到了同样的问题但没有解决。我将 tempdata 更改为 Session["rvm"] 变量并成功。考虑从临时数据转向会话。

这是设计使然。 在 Asp.Net 内核中,您不能在 TempData 中传递复杂类型。您可以传递简单类型,例如 stringintGuid

如果您绝对想通过 TempData 传递复杂类型对象,您有 2 个选择。

1) 将您的对象序列化为字符串并传递。

这是一个使用 Json.NET 将对象序列化为字符串的示例

var s = Newtonsoft.Json.JsonConvert.SerializeObject(rvm);
TempData["rvm"] = s;
return RedirectToAction("About", "Home");

现在,在您的 About 操作方法中,从 TempData 读取此值并将其反序列化到您的 RegisterViewModel class 对象。

public IActionResult About()
{
   if (TempData["rvm"] is string s)
   {
       var rvm = JsonConvert.DeserializeObject<RegisterViewModel>(s);
       // use rvm now
   }
   // to do : return something
}

2) 将简单类型的字典设置为TempData

var d = new Dictionary<string, string>
{
    ["FullName"] = rvm.FullName,
    ["Email"] = rvm.Email;
};
TempData["MyModelDict"] = d;
return RedirectToAction("About", "Home");

稍后阅读

public IActionResult About()
{
   if (TempData["MyModelDict"] is Dictionary<string,string> dict)
   {
      var name = dict["Name"];
      var email =  dict["Email"];
   }
   // to do : return something
}