2009-06-18 7 views
1

ist es möglich, einen Verweis auf das triggerElement zu erhalten, das die Ajax-Anforderung in der onSuccess-Funktion aufgerufen hat?
< a href = "/ < was>/<Aktion>" Onclick =“Sys.Mvc.AsyncHyperlink.handleClick (diese, neue Sys:
ASP.NET MVC - Referenz auf 'triggerElement' in onSuccess-Funktion erhalten?

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

Was ist im Kontext? –

+0

(Nummer) $ 0 und (Objekt) $ 1, $ 2, $ 3 und $ 4. Auch die folgenden Funktionen: get_data, get_insertionMode, get_loadingElement, get_response, set_response, get_request, get_updateTarget, Konstruktor. Ich kann das triggerElement nirgendwo finden ..... – Ropstah

Antwort

6

Die Seite wird gerendert. UI.DomEvent (Ereignis), {Einfügemodus: Sys.Mvc.InsertionMode.replace, onSuccess: Function.createDelegate (this, Funktion (Kontext) {alert ('get triggerElement Referenz hier?');})}); " > x </a >

Also lassen Sie sich bei Sys.Mvc.AsyncHyperlink.handleClick innen Scripts\MicrosoftMvcAjax.debug.js einen Blick:

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); 
} 

So ist die Action zu einem Anker gemacht wird ("a") Tag, mit einer "Onclick" Veranstaltung, die Verwendet Sys.Mvc.AsyncHyperlink.handleClick mit dieser als einer der Parameter, zugeordnet Anker.
Dann gibt es diese Anruf mit Anker als vierten Parameter. Werfen wir einen Blick in Sys.Mvc.MvcHelpers._asyncRequest haben:

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(); 
    } 
} 

So der ursprüngliche Anker jetzt triggerElement ist, aber wie Sie sehen können, ist dieser Parameter nie benutzt in die körpereigene Funktion.
Also, wenn Sie eine Art von "formellen" (oder dokumentierten) Verweis auf triggerElement haben wollen - keine solche Sache.
Aber hey, es ist JavaScript, so dass Sie fast alles zugreifen können, solange der Browser nicht auf eine andere Seite verschoben wurde, einschließlich der Anrufliste. Zum Beispiel:

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

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

a(789, "boo!"); 

</script> 

So können Sie es schließlich hacken und den ursprünglichen Anker zugreifen. Ich schlage vor, Sie wie folgt vor:

  • eine Funktion schreiben im OnBegin aufgerufen werden.
  • Innerhalb dieser Funktion Zugang die ursprüngliche triggerElement und fügen Sie es als eine Eigenschaft auf den ursprünglichen ajaxOptions (die auch zugegriffen werden kann)
  • Dann wird in der OnSuccess Funktion, Zugriff auf Ihre gehackt Eigentum ajaxOptions.
+0

Ahh ich wusste nicht über die Existenz von .caller. Ich kann bis Montag nicht testen, aber ich denke, Sie sind genau richtig. Ich werde deinen Ruf steigern! Vielen Dank! – Ropstah

+0

@Ron אאןן, überprüfen Sie bitte meine identische [Frage] (http://stackoverflow.com/questions/16454381/get-a-reference-to-the-anchor-element-of-an-ajax-actionlink-at- the-onsuccess-han). Ich benutze MVC Razor, und ich glaube, was Sie gesagt haben, ist nicht mehr gültig. Die Aktionsverknüpfungen verwenden jQuery. nicht MS Ajax. Gibt es eine Möglichkeit, einen Verweis auf den Anker zu bekommen? – Shimmy

+0

@ Shimmy. Entschuldigung, aber ich kenne die Antwort nicht ... Ich denke, du musst es selbst ausgraben, da ich wirklich keine Zeit habe, es zu tun :( –