动态生成的Ajax.BeginForm

时间:2010-02-02 11:08:16

标签: asp.net-mvc ajax ajax.beginform

我遇到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库来完成,如果答案是“是”,我在哪里做错。

非常感谢,

黄蜂

2 个答案:

答案 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()”方法向文档中添加事件处理程序来实现这一点。