How to get unobtrusive jquery remote validator to perform async..?
It's kind of hacky, but I would suggest trying the following.
First, hide the submit button with display="none"
, and show your own "submit" button, which runs your script above.
Second, in your page, add a flag var [var remotePending = false;
] and a variable for a setInterval
call [var intervalPending;
], and in your script, set the flag to true, then call the following function using intervalPending = setInterval('remoteCheck()', 200);
function remoteCheck() {
if ($.validator.pendingRequest == 0) {
// requests are done
// clear interval
clearInterval(intervalPending);
// re-enable our "submit" button
// "click" the hidden button
$("#hiddenSubmit").click();
}
// we will try again after the interval passes
}
This will allow you to wait for the completion of the pending remote validation, then proceed normally. I have not tested, so you may have to play around to get this working as you want.
I'm a bit late to the table with this, but I stumbled across this question while trying to solve a similar problem. I too didn't want to use Interval, so I cooked up a different solution and thought it might be worth detailing here for others.
In the end I decided to override the jQuery validator startRequest and stopRequest methods in order to add my own logic. After executing my own logic I simply call the old validator methods.
// Extend jQuery validator to show loading gif when making remote requests
var oldStartRequest = $.validator.prototype.startRequest;
$.validator.prototype.startRequest = function (element) {
var container = $('form').find("[data-valmsg-for='" + element.name + "']");
container.addClass('loading');
oldStartRequest.apply(this, arguments);
};
var oldStopRequest = $.validator.prototype.stopRequest;
$.validator.prototype.stopRequest = function (element) {
var container = $('form').find("[data-valmsg-for='" + element.name + "']");
container.removeClass('loading');
oldStopRequest.apply(this, arguments);
};
All I wanted to do for my purposes was simply add a 'loading' css class to an adjacent validation message field in order to show a loading gif, but you could easily extend this to enable/disable a button, etc.