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