用Ajax替换HTMl.BeginForm以避免QueryParameters

时间:2016-02-29 23:23:04

标签: jquery ajax asp.net-mvc

我正在使用Html.BeginForm在登录页面上重构一段代码。我认为它使用查询参数,我不是查询参数的忠实粉丝。我一直使用Ajax来调用具有重型模型的服务器(或者在这种情况下像登录模型这样的敏感模型)

现在,用户在登录成功时看不到两种方法之间的任何差异,因为用户在登录过程结束时会被重定向。但是,当Login失败并且Code停留在同一页面上以显示错误时,它实际上会在URL(包括用户名和密码)中显示按查询参数序列化的整个模型。

我已经用Ajax替换了代码,似乎工作正常。但是,由于这不是我的代码,我只是想确保

  1. 有没有其他(可能更好?)方式来处理这种情况?
  2. 使用Html.Beginform而不是Ajax开始的优势是什么?

1 个答案:

答案 0 :(得分:1)

您尚未显示所有相关代码(控制器方法),但有两个原因可以解释为什么您的网址会包含usernamepassword值。

1)您查看的表单正在进行GET调用,例如您已使用

@using (Html.BeginForm(yourActionName, yourControllerName, FormMethod.Get))

在这种情况下,您需要将其设为FormMethod.Post,并在控制器中包含一个接受该模型的[HttpPost]方法。

2)另一种可能性是,如果模型无效,您的POST方法将重定向回GET方法(并将usernamepassword值传递给它),在这种情况下,请不要重定向,但改为返回视图

[HttpPost]
public ActionResult Login(LoginModel model)
{
    // add `ModelStateError` is login fails
    if (!ModelState.IsValid)
    {
        return View(model);
    }
    // redirect
}

请注意,使用Html.BeginForm()是一个离开当前页面的标准提交(在POST方法中,您可以重定向或返回“相同”视图的另一个副本),而使用ajax方法则保留在同一页面上,所以他们是两个完全不同的东西。在您的情况下,您最终希望在成功登录后重定向到另一个页面,因此使用ajax没有意义。