如何在不使用TempData的情况下实现相同的结果

时间:2015-04-07 14:14:32

标签: asp.net-mvc

您将在以下代码段中使用什么代替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的新人,所以我正在寻求别人的意见。

1 个答案:

答案 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
}