MVC2 AJAX - 根据返回的数据确定UpdateTargetId

时间:2011-01-06 12:29:19

标签: jquery asp.net-mvc ajax asp.net-mvc-2

情景:

我正在为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);
    }

2 个答案:

答案 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:我感冒了,不愿意检查我的想法。