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

C# 模型数据在控制器之间消失,c#,asp.net-mvc,C#,Asp.net Mvc,所以我有一个模型,里面有两个模型,这样我可以在同一个视图上渲染到不同的视图,一个登录视图和一个注册视图 这是我的模型: public class SignUpLoginModel { public LoginModel loginmodel { get; set; } public RegisterModel registermodel { get; set; } } 当我尝试使用此控制器方法注册新用户时: public ActionResult Register(Sign

所以我有一个模型,里面有两个模型,这样我可以在同一个视图上渲染到不同的视图,一个登录视图和一个注册视图

这是我的模型:

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);
    }
因此modelstate.isvalid会按其应该的方式失败,并重定向到主控制器和register方法并发送模型。这里一切正常,模型包含数据。但当我重定向到另一个控制器时

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

我的模型以null而不是正确的数据结束。我做错了什么?

我很确定这是因为(您使用的重载或任何其他签名)没有为您转发模型。它会将302发送回浏览器,然后浏览器会向新url发出新的GET请求,因此您的模型数据将丢失

所以你需要在第一个控制器中执行类似的操作

     public ActionResult Register(SignUpLoginModel model) 
    {
        ViewBag.Message = "RegisterFail";
        return View("Index", "Home", model);
    }
{
   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提交“register”弹出表单,那么您实际上永远不会离开索引页面,您只需在服务器端执行一些代码并返回一些JSON来指示您的注册是否正常。当此响应指示错误时,您可以在弹出窗体或其他任何窗体上显示错误消息,否则您可以重定向到客户端的任何位置

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

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

然而,我不喜欢这种方法,因为我觉得你的注册表单HTML是由主页视图在线生成的,这对我来说是一个复杂的问题。

这是一篇文章吗?我猜在调用Register之前,SignupModel是空的。您能否确保视图正在填充模型?也许给我们展示一下视图?在调用寄存器之前,byt signupmodel为null是什么意思?它只是填充的模型之一。第一种情况是,用户已经有了一个帐户,并且用户登录了,这样就会填充loginmodel,而在另一种情况下,用户没有帐户,所以我想选择,这样就会填充registermodel,而不是loginmodel。很抱歉,可能我对这种方法理解不够。我猜问题可能在视图中,但我通常坚持使用更简单的模型,以便其他人能够更好地理解。我可以编辑我的问题并添加视图。这是一种弹出式方法,这就是它有点奇怪的原因。现在我得到了正确的数据,但它转到了我的dispose方法:protected override void dispose(bool disposing){if(_db!=null){u db.dispose();}base.dispose(disposing)}然后它说找不到视图:找不到视图“索引”或其主视图,或者没有视图引擎支持搜索的位置。搜索了以下位置:但是你是重定向到同一个控制器,还是完全不同的控制器?这与你原来的帖子不清楚。如果你;重新重定向到同一个控制器,没有意义-直接返回视图,如果它是另一个控制器,那么,您是否100%确定在该控制器的正确位置有一个名为Index.cshtml的视图?我使用home/Index视图,它会呈现一个弹出的loginform,但如果用户想要注册,它会按signup,然后它会切换到另一个带有RegisterPerform的弹出窗口,当他们提交表单时,他们会转到account/register尝试注册该表单形式。如果它们失败,我希望它再次呈现主/索引,但显示RegisterPerform弹出窗口istead。这就是为什么我尝试将其重定向到home/index,并发送一条viewbag消息,将其从呈现loginform中分离出来,而直接呈现registerform