使用 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 中传递复杂类型。您可以传递简单类型,例如 string
、int
、Guid
等
如果您绝对想通过 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
}
我想将视图模型添加到 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 中传递复杂类型。您可以传递简单类型,例如 string
、int
、Guid
等
如果您绝对想通过 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
}