The scenario:
我正在为MVC2应用程序创建一个登录表单 .
How i'm doing it :
表单提交MVC2操作,该操作验证用户名/密码 . 如果验证失败,则操作将返回表单(部分视图)以供用户再次尝试 . 如果它通过验证,则操作将返回用户在登录之前访问的页面(视图) .
What i want to happen:
1 - 提交表单并且用户成功验证时,返回的结果应替换当前页面(如果未设置UpdateTargetId,则会发生这种情况) .
2 - 当提交表单并且用户验证失败时,返回的结果应该替换表单(就像将UpdateTargetID设置为表单的包含元素时会发生的情况) .
The problem:
我可以让这两件事都有效,但不能同时进行 . 我可以让它总是替换当前页面,或者总是只替换UpdateTargetId元素的内容 . 但我需要它能够做到,取决于用户是否成功验证 .
What I need
理想的解决方案是能够检查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);
}
2 回答
假设如果登录名/密码无效,则假设您返回带有字符串“INVALID”的Json结果 . 然后使用UpdateTargetId .
如果Json结果!=“INVALID”,那么你将用新的部分页面替换容器 .
我就是这样做的,而且效果很好 . :-)
在服务器端代码中,检查验证是否有效,如果没有,则将RedirectToAction返回到您需要的任何完整视图 .
您遇到的问题是所有应用程序逻辑,而不是显示逻辑,因此应该在Controller而不是视图中完成,以保持您的关注点分离 .
你必须做一个RedirectToAction(即,不只是返回View(“myViewWhenInvalid”);)因为否则视图将在UpdateTargetID中呈现,这看起来不太好 .
编辑:
即:
PS:我感冒了,不愿意检查我的想法 .