【问题标题】:Using TempData dictionary prevents RedirectToAction from working使用 TempData 字典会阻止 RedirectToAction 工作
【发布时间】:2017-10-30 00:59:31
【问题描述】:

我想将视图模型添加到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 方法实际上不起作用,我只剩下一个空白页面(网址也没有改变)。我补充说,没有TempData 行,一切正常。

任何建议我在这里做错了什么?

编辑:

主页/注册

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

【问题讨论】:

  • 请出示主页/注册码。
  • 我编辑了我的问题。它看起来像这样。

标签: c# asp.net-mvc controller viewmodel


【解决方案1】:

这是设计使然。 在 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 类对象。

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
}

【讨论】:

  • 谢谢,这实际上解释了一切。太糟糕了,这么晚了;/
【解决方案2】:

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

【讨论】:

  • 由于没有更好的解决方案,我认为我将不得不切换到会话。不过还是谢谢。
猜你喜欢
  • 2011-02-23
  • 2017-05-20
  • 2022-08-18
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多