ASP.NET MVC 4 AJAX提交表单无法正常工作

14

我正在尝试使用MVC 4中的Ajax.BeginForm辅助方法将表单从同步转换为异步。

在我的视图中,我有:

   @{
        ViewBag.Title = "Users > Edit";
        var options = new AjaxOptions()
                          {
                              Url = Url.Action("Edit", "User"),
                              LoadingElementId = "saving",
                              LoadingElementDuration = 2000,
                              Confirm = "Are you sure you want to save this User?"
                          };  
    }

    <div id="saving" style="display:none; color:Red; font-weight: bold"> 
         <p>Saving...</p> 
    </div> 

    @using (Ajax.BeginForm(options)) 
    {
        @Html.ValidationSummary(true)
        <fieldset>
            .... FIELDS ...
            <p>
                <input type="submit" value="Save" />
            </p>
        </fieldset>
    }

当点击提交按钮时,会执行完整的后端回发。我的操作方法如下:

[HttpPost]
public ActionResult Edit(User user)
{
    if (ModelState.IsValid)
    {
        _repository.Save(user);
        TempData["message"] = String.Format("{0} has been saved.", user.Username);
    }

    return View(user);
 }

我有什么遗漏吗?MVC 4当前版本存在一些问题吗?

在我的Web.Config中,我已将ClientValidationEnabled和UnobtrusiveJavaScriptEnabled设置为true。

我还在我的_Layout.cshtml中指定了这些内容:

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

2
重要提示:jquery-1.9.0.min.js不支持Ajax.FormBegin和Ajax.ActionLink :( - Mustafa Kemal Yıldız
3个回答

28

我有什么遗漏吗?

也许你忘记了不显眼的 Ajax 脚本:

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

是的,哈,你发现了它!有validate.unobtrusive.js等等。哎呀!谢谢:D - adamwtiko

0

如果我理解正确,您正在尝试将数据发布到控制器,在成功后需要转到主页?如果不是,请澄清一下。这样我就可以帮助您了。

if (ModelState.IsValid)
    {
        _repository.Save(user);
        TempData["message"] = String.Format("{0} has been saved.", user.Username);
        return RedirectToAction("yourActionToRedirect");  // after succesfull it will go to the index view
    }

在这个例子中,我实际上想要返回到当前视图,并使用相同的用户数据,例如:return View(user); - adamwtiko
那问题是什么??你尝试过调试吗?它是否触发了用户控制器上的操作? - Ravi Gadag
它没有以异步方式运行。页面正在被提交,而Request.IsAjaxRequest()在Edit操作中返回false。 - adamwtiko

0

我曾经遇到过同样的问题... 我使用NuGet包控制台更新了所有js文件。

这只是我的个人意见,但在撰写本文时,jquery.unobtrusive.ajax文件确实包含对已弃用的jquery函数'.live'的调用(=> 它已从jquery 1.9+版本中删除)jquery live

我认为你需要更改大约4个出现的地方,改为使用.on,现在它可以正常工作了;-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接