情景:
我正在为MVC2应用程序创建一个登录表单。
我是怎么做的:
表单提交MVC2操作,该操作验证用户名/密码。如果验证失败,则操作将返回表单(部分视图)以供用户再次尝试。如果它通过验证,则操作将返回用户在登录之前访问的页面(视图)。
我想要发生什么:
1 - 提交表单并且用户成功验证后,返回的结果应该替换当前页面(如果没有设置UpdateTargetId会发生什么情况)。
2 - 当提交表单并且用户验证失败时,返回的结果应该替换表单(如果将UpdateTargetID设置为包含元素的表单时会发生什么)。
问题:
我可以让这两件事都有效,但不能同时进行。我可以让它总是替换当前页面,或者总是只替换UpdateTargetId元素的内容。但我需要它能够做到,取决于用户是否成功验证。
我需要什么
理想的解决方案是能够检查ajax请求的结果并确定是否使用UpdateTargetId(仅替换表单)(替换整个页面)。我希望它会涉及到jquery的一些工作(假设它是可能的)但是我对jquery并不是那么好,还没弄明白如何自己做。如果不能以这种方式完成,我也会接受其他方法/解决方案,以使其以类似的方式工作。
提前致谢..
根据要求。行动准则。但正如我所说。这是每个mvc应用程序默认发布的标准LogOn操作。唯一的区别是它在验证失败时返回部分视图。
[HttpPost]
[MedLife.Code.Compression.CompressFilter]
public ActionResult SignIn(LogOnModel model, string returnUrl)
{
if (ModelState.IsValid)
{
if (MembershipService.ValidateUser(model.UserName, model.Password))
{
FormsService.SignIn(model.UserName, model.RememberMe);
if (!String.IsNullOrEmpty(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
}
// If we got this far, something failed, redisplay form
return PartialView("Overlays/LoginControl", model);
}
答案 0 :(得分:1)
如果登录名/密码无效,我们假设您返回带有字符串“INVALID”的Json结果。然后使用UpdateTargetId。
如果Json结果!=“INVALID”,那么你将用新的部分页面替换容器。
我就是这样做的,而且效果很好。 : - )
答案 1 :(得分:1)
在服务器端代码中,检查验证是否有效,如果没有,则将RedirectToAction返回到您需要的任何完整视图。
您遇到的问题是所有应用程序逻辑,而不是显示逻辑,因此应该在Controller而不是视图中完成,以便将您的问题分开。
你必须做一个RedirectToAction(即,不仅仅返回View(“myViewWhenInvalid”);)因为否则视图将在UpdateTargetID中呈现,这看起来不会很好。
编辑:
即:
public ActionResult myLoginAction(string name, string pwd)
{
// do the login stuff
if (loggedIn)
{
return RedirectToAction(...);
}
else
{
return MyJsonAction();
}
}
public MyJsonAction()
{
return some Json...;
}
PS:我感冒了,不愿意检查我的想法。