为什么Ajax.BeginForm不能在Chrome中运行?

时间:2012-02-16 10:46:57

标签: c# asp.net asp.net-mvc-2 asp.net-ajax

我正在使用c#.NET MVC2,我正在尝试创建一个调用删除数据库记录(RemoveRelation)的方法的ajax表单。删除记录的过程按预期工作。 删除记录后,表单应调用一个javascript函数,从视觉中删除记录(RemoveRelation(10))。这是通过一个AJAX调用来完成的,在Internet Explorer 9和Firefox 4上都按预期工作,但是由于某些原因,更新没有通过AJAX调用发生,并且当删除记录的表单正在刷新时整个页面都是刷新的提交(这是不正确的,因为表单应该是使用AJAX功能生成的)。这是我生成表单的代码:

 <% using (Ajax.BeginForm("RemoveRelation", "Relations",
       new AjaxOptions { OnSuccess = "function() { RemoveRelation(10); } ", InsertionMode = InsertionMode.Replace, UpdateTargetId = "Relation10" },
       new { id = "DeleteForm10" }))
   { %>

此外,在Chrome上我还有另一个问题,即单独的Ajax.BeginForm。

<% using (Ajax.BeginForm("AddRelation", "Relations", new AjaxOptions { InsertionMode = InsertionMode.Replace, UpdateTargetId = "AddRelation" }, new { id = "AddRelationForm" }))
  { %>

上面的Begin Form代码用于将关系添加到列表而不是删除它们。我再次强调,在IE9和FF4上,上面的工作正常,在chrome而不是添加一个并通过ajax更新,而是添加记录两次,再次刷新整个页面而不是进行ajax更新。

为什么这会在chrome中崩溃?

3 个答案:

答案 0 :(得分:12)

Microsoft AJAX和某些webkit浏览器存在问题。我不久前遇到过这个问题,修复很简单。创建一个webkit.js文件并将其放在内容中:

Sys.Browser.WebKit = {}; //Safari 3 is considered WebKit
if( navigator.userAgent.indexOf( 'WebKit/' ) > -1 )
{
    Sys.Browser.agent = Sys.Browser.WebKit;
    Sys.Browser.version = parseFloat( navigator.userAgent.match(/WebKit\/(\d+(\.\d+)?)/)[1]);
    Sys.Browser.name = 'WebKit';
}

然后,无论是在ScriptManager中还是在页面中的某个位置(最好是在母版页中,我将其添加到最后),添加脚本参考:

<Scripts>
    <asp:ScriptReference Path="webkit.js" />
</Scripts>
//OR
<script src="webkit.js">

无法记住我找到该信息的原始网站,但我能够从this page获得。祝你好运!

答案 1 :(得分:1)

你可以更新你的项目使用asp.net MVC 3,在mvc 3中,jquery ajax是默认的

答案 2 :(得分:1)

我找到了解决问题的奇怪方法。我通过'a'标签调用ajax表单提交:

<A href='#' onclick="javascript:$('#ajaxform').submit();">Remove</a>

出于某种原因,从'a'标签调用'.submit()'会导致整个页面刷新而不是ajax调用。我通过使用以下代码修复了该问题:

<input type='submit' value='Remove' />

当我需要在输入中添加javascript命令以在删除之前请求确认时,此解决方案也有效。唯一的抱怨是我需要交换一些标记以确保我的按钮在他们提交的表单中发生(我理解的并不总是在所有情况下都可以。)