您将在以下代码段中使用什么代替TempData来获得相同的预期结果 - 在无效的ModelState情况下重定向并传递登录错误?
public ActionResult Welcome(string returnUrl, int accountTypeId = 0)
{
//this is logic from the original login page. not sure if this would ever occur. we may be able to remove this.
if (string.IsNullOrEmpty(returnUrl) == false && returnUrl.Contains("?route="))
{
var split = returnUrl.Split(new[] {"?route="}, StringSplitOptions.None);
var route = Server.UrlDecode(split[1]);
returnUrl = split[0] + "#" + route;
}
object model;
if (TempData.TryGetValue("LogOnModel", out model) == false)
{
model = new LogOnModel
{
ReturnUrl = returnUrl,
AccountTypeId = accountTypeId
};
}
object errors;
if (TempData.TryGetValue("Errors", out errors))
{
ModelState.Merge(errors as ModelStateDictionary);
}
return View(model);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Welcome(LogOnModel model)
{
Func<ActionResult> invalid = () =>
{
TempData.Add("Errors", ModelState);
TempData.Add("LogOnModel", model);
return RedirectToAction("Welcome");
};
if (ModelState.IsValid == false)
{
return invalid();
}
现在,如果用户单击后退按钮并尝试第二次登录,代码会生成错误。错误消息&#34;已输入具有相同密钥的项目&#34;我试图避免这个错误。我尝试在TempData的位置使用ViewData,但是如果有人输入了错误的密码,那就破坏了我的登录错误消息。我是MVC的新人,所以我正在寻求别人的意见。
答案 0 :(得分:0)
看起来你没有做任何ajax,因此在这种情况下你不需要重定向错误。当模型状态无效时,您将为您填充一个名为模型状态错误的集合。您只需要再次返回欢迎视图,并将@ Html.ValidationSummary添加到欢迎页面cshtml。
Html.ValidationSummary读取模型状态错误,然后确定是否需要显示错误框。这就是我要做的事。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Welcome(LogOnModel model)
{
if (ModelState.IsValid == false)
{//We have model state errors populated here for us
return View(model);
}
//Do Work
}