模型数据在控制器之间消失

本文关键字:之间 消失 控制器 数据 模型 | 更新日期: 2023-09-27 18:03:56

所以我有一个有两个模型的模型,这样我就可以在同一视图上呈现不同的视图,一个登录视图和一个注册视图。

这是我的模型:

public class SignUpLoginModel
{
    public LoginModel loginmodel { get; set; }
    public RegisterModel registermodel { get; set; }
}

当我尝试用这个控制器方法注册一个新用户时:

  public ActionResult Register(SignUpLoginModel model)
    {
        if (ModelState.IsValid)
        {
            // Attempt to register the user
            try
            {
                WebSecurity.CreateUserAndAccount(model.registermodel.UserName,
                    model.registermodel.Password,
                    new
                    {
                        FirstName = model.registermodel.Firstname,
                        LastName = model.registermodel.Lastname,
                        Country = model.registermodel.Country,
                        City = model.registermodel.City,
                        Birthdate = model.registermodel.Birthdate
                    });
                WebSecurity.Login(model.registermodel.UserName, model.registermodel.Password);
                return RedirectToAction("Index", "Home");
            }
            catch (MembershipCreateUserException e)
            {
                ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
            }
        }
        // If we got this far, something failed, redisplay form
        return RedirectToAction("Register", "Home", model);
    }

模型状态。Isvalid失败了,它重定向到home控制器和register方法,并发送模型。这里一切正常,模型包含数据。但是当我重定向到另一个控制器

     public ActionResult Register(SignUpLoginModel model) 
    {
        ViewBag.Message = "RegisterFail";
        return View("Index", "Home", model);
    }

我的模型最终得到null而不是正确的数据。我做错了什么?

模型数据在控制器之间消失

我很确定这是因为RedirectToAction(既不是你正在使用的过载也不是任何其他签名)不会为你转发你的模型。它发送一个302回你的浏览器,然后发出一个新的GET请求到一个新的url -因此你的模型数据丢失。

那么你需要在第一个控制器

中做这样的事情
{
   TempData["signupModel"]=model;       
   return RedirectToAction("Register", "Home", model);       
}

,然后在重定向控制器中:

public ActionResult Register(SignUpLoginModel model) 
    {
        ViewBag.Message = "RegisterFail";
        return View("Index", "Home", TempData["signupModel"]);
    }

但是我不明白的是为什么你不直接返回一个视图第一次左右,为什么你需要重定向-因为从你的代码你似乎只是重定向回相同的控制器-或者我错过了什么?

根据下面的注释编辑

老实说,我认为你最好使用Ajax来做这个,因为你在这里试图做的是跨多个控制器/视图维护状态,这不是MVC真正惯用的。

如果你通过Ajax提交"注册"弹出表单,那么你从来没有真正离开索引页面,你只是执行一些代码服务器端和返回一些JSON来指示你的注册是否OK。当此响应指示错误时,您可以在弹出式表单或其他地方显示错误消息,否则您可以重定向到客户端的任何位置。

当您的Register控制器决定注册失败时,返回主页索引视图,例如

ViewBag.Message = "RegisterFail";
return View("~/HomePage/HomeController/Index.cshtml", model); //or whatever the virtual path to the home page view is

然而,我不喜欢这种方法,因为它听起来像你有你的注册表单HTML被生成内联的主页视图,这听起来像混合的关注我