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

Wil*_*eja 14 c# asp.net asp.net-ajax asp.net-mvc-2

我正在使用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" }))
   { %>
Run Code Online (Sandbox Code Playgroud)

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

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

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

为什么这会在chrome中崩溃?

SPF*_*ake 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';
}
Run Code Online (Sandbox Code Playgroud)

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

<Scripts>
    <asp:ScriptReference Path="webkit.js" />
</Scripts>
//OR
<script src="webkit.js">
Run Code Online (Sandbox Code Playgroud)

不记得我找到信息的原始网站,但我能从这个页面得到.祝好运!


Wil*_*eja 1

我找到了一个奇怪的解决方案来解决这个问题。我通过“a”标签调用ajax表单的提交,如下所示:

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

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

<input type='submit' value='Remove' />
Run Code Online (Sandbox Code Playgroud)

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

  • 你本来可以保留它。您只需要在 onclick 结束时返回 false (因此它将是 `onclick="javascript:$('#ajaxform').submit();return false;"`)。原因是“a”标签导致浏览器导航到链接(即使它没有去任何地方)并返回 false 只是阻止默认浏览器操作的发生。来源:http://jszen.blogspot.com/2007/03/return-false-to-prevent-jumping.html (2认同)