我现在一直在等待将我的Asp.net预览4项目带到鼻烟,完全跳过预览5只是因为我知道我会遇到一些问题。
无论如何,这是一个问题和困境。
我在网站上有一些区域,我有一个ajax更新类型面板,可以使用此处的技术从视图中呈现内容。 AJAX Panels with ASP.NET MVC
这在预览版4中运行良好,但现在在测试版中,我一直都是这样做的。
Sys.ArgumentNullException: Value cannot be null Parameter name eventObject
这让我疯了......
我的代码看起来像这样
<% using (this.Ajax.BeginForm("ReportOne", "Reports", null, new AjaxOptions { UpdateTargetId = "panel1" }, new { id = "panelOneForm" })) { } %>
<div class="panel" id="panel1"><img src="/Content/ajax-loader.gif" /></div>
<script type="text/javascript">
$get("panelOneForm").onsubmit();
</script>
所以基本上它正在做的是强制表单上的提交,它使用ReportOne视图中的内容更新panel1。
我错过了什么?为什么我收到此错误?为什么他们去改变一切?我喜欢MVC,但这让我很疯狂。
答案 0 :(得分:1)
不幸的是,只是调用submit()不会触发onsubmit事件,因此MVC Ajax脚本将无法运行。当浏览器为您调用onsubmit()时(因为用户点击了提交按钮),它实际上提供了一个名为 event 的参数(如果你看一下,你可以看到由Ajax助手输出的Html)。
因此,当您手动调用onsubmit()时,需要提供此参数(因为MVC Ajax代码需要它)。所以,你可以做的是创建一个“假”事件参数,并将其传递给onsubmit:
<% using (this.Ajax.BeginForm("ReportOne", "Reports", null, new AjaxOptions { UpdateTargetId = "panel1" }, new { id = "panelOneForm" })) { } %>
<div class="panel" id="panel1"><img src="/Content/ajax-loader.gif" /></div>
<script type="text/javascript">
$get("panelOneForm").onsubmit({ preventDefault: function() {} });
</script>
重要的部分是 {preventDefault:function(){}} 部分,该部分创建一个JSON对象,该对象具有一个名为“preventDefault”的方法,该方法不执行任何操作。这是MVC Ajax脚本对事件对象唯一做的事情,所以这应该可以正常工作。
如果MVC Ajax代码有一个只忽略空事件参数的检查( wink @Eilon:P)
,也许是一个长期修复。答案 1 :(得分:0)
我相信调用someFormElement.onsubmit()只会调用为该事件注册的事件处理程序。要正确提交表单,您应该调用someFormElement.submit()(不带“on”前缀)。
我认为我们没有改变ASP.NET MVC Preview 4和ASP.NET MVC Beta之间AJAX助手的行为。
谢谢, Eilon
答案 2 :(得分:0)
有一些与这个问题有关的恼人问题。希望有人能帮到我。
var event = new Object();
function refreshInformation(){
document.forms['MyForm'].onsubmit({preventDefault: function(){} });
}
这是我目前的代码,它适用于更新表单。问题是“var事件”会破坏所有其他javascript事件,如果我有这样的话:
<img src="myimg.gif" onmouseover="showmousepos(event)" />
它不是发送给函数的鼠标事件,而是我必须声明的“var事件”,以使onsubmit正常运行。
如果仅使用
onsubmit({preventDefault: function(){} }
而没有“var事件”,我会获得Sys.ArgumentNullException: Value cannot be null Parameter name eventObject
我也试过使用
submit()
这会做一个完整的回发并完全忽略ajaxform的东西......至少在我的解决方案中。嗯......我意识到这可能有点令人困惑,但如果有人理解这个问题,那么如果你有一个解决方案也会很棒。 =) 如果您需要有关此问题的更多信息,请询问,我会尝试详细说明。