我遇到ASP.NET MVC Ajax表单的问题。我在表中生成了几个Ajax表单,如下所示:
<%
foreach (var item in Model)
{
var statefulItem = item as StatefulEffectiveItem; %>
<tr>
<td>
<% using (Ajax.BeginForm("ShowAddActivity", "EffectiveItems", new { id = item.Id }, new AjaxOptions() { UpdateTargetId = "details", OnSuccess = "dialogIt" }))
{ %>
<input type="submit" name="activity" value="Add Activity" />
<% } %>
</td>
</tr>
<% } %>
到目前为止一切顺利。当我发布其中一个表单时,它会在div中呈现局部视图,而这个新的局部视图包含一个新的Ajax.BeginForm(它不是嵌套在原始表单中)。第二个Ajax.BeginForm与我在表中生成的那个绝对相似,但是当我发布它时,我没有得到“Ajax帖子”,而是一个普通的帖子,它将我发送到一个新页面。我不明白是什么导致了这两个Ajax表单的区别,为什么这个“动态生成的”Ajax表单的行为就像普通的html表单一样?
顺便说一句,我知道我可以使用Javascript以不同的方式做到这一点,但我想了解是否可以使用MVC助手和Ajax库来完成,如果答案是“是”,我在哪里做错。
非常感谢,
黄蜂
答案 0 :(得分:2)
我不知道是否可以使用MS AJAX,但我可以告诉你有什么问题。一旦你更新了第一个ajax上的partial,这个更新的部分包含javascript来为新表单注册ajax。这个javascript是不执行,因为没有任何东西告诉它执行。你必须调用一个javascript函数,在第一个ajax请求的成功回调中为第二个表单注册ajax。
答案 1 :(得分:0)
编辑/scripts/jquery.unobtrusive-ajax.js文件
更改
$("a[data-ajax=true]").on("click", function (evt) { ..... }
到
$(document).on("click","a[data-ajax=true]", function (evt) { ...... }
对文件中的所有其他事件注册执行此操作。
$(document).on("click","form[data-ajax=true] input[type=image]"
$(document).on("click","form[data-ajax=true] :submit"
$(document).on("submit","form[data-ajax=true]",
这样,您可以将事件注册到文档,从而允许对动态添加的元素进行事件处理。 jQuery以前使用过“.live()”,但现在你可以通过“.on()”方法向文档中添加事件处理程序来实现这一点。