1

triggerElement関数内で Ajax リクエストを呼び出したへの参照を取得することはできonSuccessますか?

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

1 に答える 1

6

ページは次のようにレンダリングされます:
<a href="/<whatever>/<action>" onclick=" Sys.Mvc.AsyncHyperlink.handleClickthis、new Sys.UI.DomEvent(event)、{insertionMode:Sys.Mvc。 InsertionMode.replace、onSuccess:Function.createDelegate(this、function(context){alert('get triggerElement reference here?');})}); "> x </a>

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"イベントが発生します。このイベントは、これをパラメーターの1つとして使用Sys.Mvc.AsyncHyperlink.handleClickanchorにマップされます。 次に、4番目のパラメーターとしてanchorを使用したこの呼び出しがあります。見てみましょう:
Sys.Mvc.MvcHelpers._asyncRequestSys.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
于 2009-07-01T12:39:00.773 に答える