【问题标题】:Ajax form changes urlAjax 表单更改 url
【发布时间】:2014-02-15 20:11:44
【问题描述】:

我有一个 ajax 表单:

@model Site.Models.ChangeModel
@using (Ajax.BeginForm("ChangePassword", "Account", new AjaxOptions { HttpMethod = "POST", UpdateTargetId="result" }, new { @class = "form-horizontal", role = "form", id = "changePasswordForm" }))
{
    <div id="result"></div>
    @Html.AntiForgeryToken()

    @Html.ValidationSummary(true, Base.ChangesNotSubmitted, new { @class = "alert alert-danger" })

    @Html.EditorFor(m => m.ChangePasswordModel.OldPassword)

    @Html.EditorFor(m => m.ChangePasswordModel.Password)

    @Html.EditorFor(m => m.ChangePasswordModel.ConfirmPassword)

    <div class="form-group">
        <div class="col-sm-offset-6 col-sm-2">
            <button type="submit" class="btn btn-primary">@Base.ChangePassword</button>
        </div>
    </div>
}

通过此操作

   [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult ChangePassword(ChangePasswordModel model)
    {
        bool changed=false;
        if (ModelState.IsValid)
        {
            var result = UserManager.ChangePassword(User.Identity.GetUserId(), model.OldPassword, model.Password);
            if (result.Succeeded)
            {
                changed = true;
            }
        }

        return Content("changed");

    }

表单位于操作索引中,我没有更改密码的视图!

提交表单后我得到:

  • 包含我已发送内容的空白页
  • 网址已更改为 .../ChangePassword?length=7(之前为 /index)

我不知道这个长度参数是从哪里来的。

所以我的问题是如何保持相同的视图并在正确的 div 中获得结果?

任何人知道参数长度的来源,我已经遇到过几次这个问题了。

【问题讨论】:

  • 您是否引用了所有必要的脚本?我看到的Ajax.BeginForm() 最常见的问题是没有引用所有脚本或以错误的顺序引用它们。

标签: ajax asp.net-mvc-4 ajaxform


【解决方案1】:

请确保您已在标头中包含 ajax javascript 文件。

<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>>

【讨论】:

    【解决方案2】:

    你必须像这样使用一些:

    return RedirectToAction("ViewName", [new { args } OR model]);
    

    ContentResult 可用于以纯文本形式返回操作。该类继承自“ActionResult”抽象类。

    【讨论】:

    • 但是 ajax 假设留在同一个页面上,为什么它呈现给我另一个页面很奇怪:(
    • 例如,我扩展了一个 div,但提交后它被关闭:/这是正确的行为吗?
    • 是的,因为你的 ajax 替换形式:pdateTargetId = "result"
    • 但是这个 div 在表单内
    • 当您返回 Content("") 时,您将获得一个包含此内容的新页面,以 ActionResult 命名
    【解决方案3】:

    如果有人遇到有关长度参数的问题(您上面的第二个问题),您可以按如下方式更改方法调用:

    @using (Ajax.BeginForm("ChangePassword", "Account", new AjaxOptions { HttpMethod = "POST", UpdateTargetId="result" }, new { @class = "form-horizontal", role = "form", id = "changePasswordForm" }))
    
    //to:
    
    @using (Ajax.BeginForm("ChangePassword", "Account", null, new AjaxOptions { HttpMethod = "POST", UpdateTargetId="result" }, new { @class = "form-horizontal", role = "form", id = "changePasswordForm" }))
    

    /ChangePassword?length=7 的长度参数将消失。长度来自控制器名称“帐户”中的字符数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-10
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 2013-04-10
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多