ASP.NET MVC - получить ссылку на 'triggerElement' в функции onSuccess? - PullRequest
1 голос
/ 18 июня 2009

возможно ли получить ссылку на triggerElement, который вызвал Ajax-запрос в функции onSuccess?

<%=Ajax.ActionLink("x", a, r, New AjaxOptions With {.OnSuccess = _
         "function(context) {alert('get triggerElement reference here?');}" })%>

1 Ответ

6 голосов
/ 01 июля 2009

Страница отображается на:
/" onclick="Sys.Mvc.AsyncHyperlink.handleClick(this, new Sys.UI.DomEvent(event), { insertionMode: Sys.Mvc.InsertionMode.replace, onSuccess: Function.createDelegate(this, function(context) { alert('get triggerElement reference here?'); }) });"> х

Итак, давайте посмотрим на Sys.Mvc.AsyncHyperlink.handleClick внутри Scripts\MicrosoftMvcAjax.debug.js:

Sys.Mvc.AsyncHyperlink.handleClick = function Sys_Mvc_AsyncHyperlink$handleClick(anchor, evt, ajaxOptions) {
    /// omitted doc comments
    evt.preventDefault();
    Sys.Mvc.MvcHelpers._asyncRequest(anchor.href, 'post', '', anchor, ajaxOptions);
}

Таким образом, ActionLink отображается в теге привязки («a») с событием «onclick», которое использует Sys.Mvc.AsyncHyperlink.handleClick с this в качестве одного из параметров, сопоставленных с привязкой .
Тогда есть этот вызов Sys.Mvc.MvcHelpers._asyncRequest с якорь в качестве четвертого параметра. Давайте посмотрим на Sys.Mvc.MvcHelpers._asyncRequest:

Sys.Mvc.MvcHelpers._asyncRequest = function Sys_Mvc_MvcHelpers$_asyncRequest(url, verb, body, triggerElement, ajaxOptions) {
    /// omitted documentation
    if (ajaxOptions.confirm) {
        if (!confirm(ajaxOptions.confirm)) {
            return;
        }
    }
    if (ajaxOptions.url) {
        url = ajaxOptions.url;
    }
    if (ajaxOptions.httpMethod) {
        verb = ajaxOptions.httpMethod;
    }
    if (body.length > 0 && !body.endsWith('&')) {
        body += '&';
    }
    body += 'X-Requested-With=XMLHttpRequest';
    var requestBody = '';
    if (verb.toUpperCase() === 'GET' || verb.toUpperCase() === 'DELETE') {
        if (url.indexOf('?') > -1) {
            if (!url.endsWith('&')) {
                url += '&';
            }
            url += body;
        }
        else {
            url += '?';
            url += body;
        }
    }
    else {
        requestBody = body;
    }
    var request = new Sys.Net.WebRequest();
    request.set_url(url);
    request.set_httpVerb(verb);
    request.set_body(requestBody);
    if (verb.toUpperCase() === 'PUT') {
        request.get_headers()['Content-Type'] = 'application/x-www-form-urlencoded;';
    }
    request.get_headers()['X-Requested-With'] = 'XMLHttpRequest';
    var updateElement = null;
    if (ajaxOptions.updateTargetId) {
        updateElement = $get(ajaxOptions.updateTargetId);
    }
    var loadingElement = null;
    if (ajaxOptions.loadingElementId) {
        loadingElement = $get(ajaxOptions.loadingElementId);
    }
    var ajaxContext = new Sys.Mvc.AjaxContext(request, updateElement, loadingElement, ajaxOptions.insertionMode);
    var continueRequest = true;
    if (ajaxOptions.onBegin) {
        continueRequest = ajaxOptions.onBegin(ajaxContext) !== false;
    }
    if (loadingElement) {
        Sys.UI.DomElement.setVisible(ajaxContext.get_loadingElement(), true);
    }
    if (continueRequest) {
        request.add_completed(Function.createDelegate(null, function(executor) {
            Sys.Mvc.MvcHelpers._onComplete(request, ajaxOptions, ajaxContext);
        }));
        request.invoke();
    }
}

Итак, исходный якорь теперь triggerElement , но, как вы можете видеть, этот параметр никогда не использовал в теле функции.
Так что, если вы хотите иметь какую-то «формальную» (или документированную) ссылку на triggerElement - такого нет.
Но это же JavaScript, так что вы можете получить доступ практически ко всему, если браузер не переместился на другую страницу, , включая стек вызовов . Например:

<script type="text/javascript">
function a(p, q)
{
    b();
}

function b() {
    var x = arguments.caller[1];
    alert(x); // boo!
}

a(789, "boo!");

</script>

Так что в конце концов вы можете взломать его и получить доступ к исходному якору. Я предлагаю вам сделать следующее:

  • Напишите функцию, которая будет вызываться в OnBegin.
  • Внутри этой функции доступ оригинал triggerElement, и добавить его как свойство к оригиналу ajaxOptions (к которому можно получить доступ, тоже)
  • Затем в функции OnSuccess получить доступ к вашей взломанной собственности ajaxOptions.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...