使用TempData字典可防止RedirectToAction工作

时间:2017-10-30 00:59:32

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

我想将视图模型添加到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);
}

2 个答案:

答案 0 :(得分:2)

这是设计的。 在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
}

答案 1 :(得分:0)

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