在OnSuccess中获取调用表单

时间:2013-02-01 21:24:37

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

<div class=".parentForm'>
    @Ajax.BeginForm(... AjaxOptions { OnSuccess = "submitSuccess" })
    {...}
</div>

function postDone(result,two, three) {
   $('.parentForm').replaceWith(result);
}

我不喜欢这个,因为如果这个部分中有多个表单,它们都会有相同的类,我宁愿不提出一些时髦的方案,我在服务器端生成一个ID并且必须通过它围绕着JS回调。

使用.ajax我可以使用this来获取提交请求的表单,然后从那里获取父.formContainer。有没有办法获得使用OnSuccess提交表单的表单?

2 个答案:

答案 0 :(得分:2)

实际上,您仍然需要修改jquery.unobtrusive-ajax.js文件,这是一种更简单的方法。在第100行附近添加一行代码。我提供了相同的答案here

options.data.push({ name: "X-Requested-With", value: "XMLHttpRequest" });

options.context = element; // <--- Add this line

method = options.type.toUpperCase();
if (!isMethodProxySafe(method)) {
    options.type = "POST";
    options.data.push({ name: "X-HTTP-Method-Override", value: method });
}

更新:AaronLS在codeplex上创建了一个问题,看看他们是否会对jQuery Unobtrusive Ajax文件本身进行更改,如果您希望添加此更改,请提升它!

Codeplex Issue: Let 'this' reference the source element

答案 1 :(得分:1)

当然,但您需要修改jquery.unobtrusive-ajax.js文件。您必须替换以下行:

success: function (data, status, xhr) {
    asyncOnSuccess(element, data, xhr.getResponseHeader("Content-Type") || "text/html");       
    getFunction(element.getAttribute("data-ajax-success"), ["data", "status", "xhr"]).apply(this, arguments);
},

使用:

success: function (data, status, xhr) {
    asyncOnSuccess(element, data, xhr.getResponseHeader("Content-Type") || "text/html");
    var args = $.merge(arguments, [element]);
    getFunction(element.getAttribute("data-ajax-success"), ["data", "status", "xhr"]).apply(this, args);
},

可以这样访问表单:

function submitSuccess(result, status, xhr, element) {
    // element is your form
}