我想将视图模型添加到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);
}
答案 0 :(得分:2)
这是设计的。 在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
类对象。
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。