ASP.NET MVC - 取得的onSuccess函数参考“triggerElement”? [英] ASP.NET MVC - Get reference to 'triggerElement' in onSuccess function?

查看:81
本文介绍了ASP.NET MVC - 取得的onSuccess函数参考“triggerElement”?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是有可能得到与调用的函数的onSuccess Ajax请求的triggerElement参考?

 <%= Ajax.ActionLink(X,A,R,新AjaxOptions随着{.OnSuccess = _
         功能(上下文){警报('在这里得到triggerElement参考?');})%GT;


解决方案

该页面渲染到:

< A HREF =/<凡是> /<作用>中的onclick = Sys.Mvc.AsyncHyperlink.handleClick 这个的,新的Sys.UI.DomEvent(事件){insertionMode:Sys.Mvc.InsertionMode.replace,的onSuccess: Function.createDelegate(这一点,函数(上下文){警报('在这里得到triggerElement参考?');})});> X< / A>

因此​​,让我们脚本里面看看 Sys.Mvc.AsyncHyperlink.handleClick \\ MicrosoftMvcAjax.debug.js

  Sys.Mvc.AsyncHyperlink.handleClick =功能Sys_Mvc_AsyncHyperlink $ handleClick(锚,EVT,ajaxOptions){
    ///忽略文档注释
    。EVT preventDefault();
    Sys.Mvc.MvcHelpers._asyncRequest(anchor.href,'后','',锚,ajaxOptions);
}

因此​​,ActionLink的呈现给一个锚(A)的标签,有一个的onclick事件,它使用 Sys.Mvc.AsyncHyperlink.handleClick 这个的作为参数,映射到的锚的。

此外,还有用的的作为第四个参数此 Sys.Mvc.MvcHelpers._asyncRequest 电话。让我们在看看 Sys.Mvc.MvcHelpers._asyncRequest

  Sys.Mvc.MvcHelpers._asyncRequest =功能Sys_Mvc_MvcHelpers $ _asyncRequest(URL,动词,身体,triggerElement,ajaxOptions){
    ///省略文档
    如果(ajaxOptions.confirm){
        如果(!确认(ajaxOptions.confirm)){
            返回;
        }
    }
    如果(ajaxOptions.url){
        URL = ajaxOptions.url;
    }
    如果(ajaxOptions.httpMethod){
        动词= ajaxOptions.httpMethod;
    }
    如果(body.length大于0&放大器;&放大器;!body.endsWith('和;')){
        身体+ ='和;';
    }
    身体+ ='X-要求,随着= XMLHtt prequest';
    VAR requestBody ='';
    如果(verb.toUpperCase()==='GET'|| verb.toUpperCase()===删除){
        如果('?'url.indexOf()-1个){
            如果(url.endsWith(!'和;')){
                网址+ ='和;';
            }
            网址+ =身体;
        }
        其他{
            网址+ ='?';
            网址+ =身体;
        }
    }
    其他{
        requestBody =身体;
    }
    VAR要求=新Sys.Net.WebRequest();
    request.set_url(URL);
    request.set_httpVerb(动词);
    request.set_body(requestBody);
    如果(verb.toUpperCase()==='把'){
        request.get_headers()['内容类型'] ='应用/的X WWW的形式urlen codeD;';
    }
    request.get_headers()['X-要求-随着'] ='XMLHtt prequest';
    VAR updateElement = NULL;
    如果(ajaxOptions.updateTargetId){
        updateElement = $ GET(ajaxOptions.updateTargetId);
    }
    VAR loadingElement = NULL;
    如果(ajaxOptions.loadingElementId){
        loadingElement = $ GET(ajaxOptions.loadingElementId);
    }
    VAR ajaxContext =新Sys.Mvc.AjaxContext(请求updateElement,loadingElement,ajaxOptions.insertionMode);
    VAR continueRequest = TRUE;
    如果(ajaxOptions.onBegin){
        continueRequest = ajaxOptions.onBegin(ajaxContext)==假的!;
    }
    如果(loadingElement){
        Sys.UI.DomElement.setVisible(ajaxContext.get_loadingElement(),TRUE);
    }
    如果(continueRequest){
        request.add_completed(Function.createDelegate(NULL,功能(执行者){
            Sys.Mvc.MvcHelpers._onComplete(要求,ajaxOptions,ajaxContext);
        }));
        request.invoke();
    }
}

所以原来的的是现在的 triggerElement 的,但你可以看到,这个参数的从未使用过的函数体

所以,如果你想有某种形式的形式(或文件)提及triggerElement - 没有这样的事

但是,嘿,这是JavaScript,因此你可以只要访问几乎所有的东西作为浏览器没有移动到另一页,包括调用堆栈。例如:

 <脚本类型=文/ JavaScript的>
起作用的(P,Q)
{
    B();
}函数b(){
    变种X =包含arguments.caller [1];
    警报(X); //嘘!
}一个(789,嘘!);< / SCRIPT>

所以最后你可以破解它,访问原来的锚。我建议你​​做以下内容:


  • 写一个函数的调用
    OnBegin

  • 在这个函数中,访问
    triggerElement ,和
    加上它作为一个财产原
    ajaxOptions (可接,
    太)

  • 然后,在的onSuccess 功能,
    访问你的财产砍死
    ajaxOptions

is it possible to get a reference to the triggerElement that invoked the Ajax request in the onSuccess function?

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

解决方案

The page is rendered to:
<a href="/<whatever>/<action>" 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?'); }) });">x</a>

So let's have a look at Sys.Mvc.AsyncHyperlink.handleClick inside 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);
}

So the ActionLink is rendered to an anchor ("a") tag, with an "onclick" event, which uses Sys.Mvc.AsyncHyperlink.handleClick with this as one of the parameters, mapped to anchor.
Then there's this Sys.Mvc.MvcHelpers._asyncRequest call with anchor as the fourth parameter. Let's have a look in 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();
    }
}

So the original anchor is now triggerElement, but as you can see, this parameter is never used in the function's body.
So, if you want to have some kind of a "formal" (or documented) reference to triggerElement - no such thing.
But hey, it's JavaScript, so you can access almost anything as long as the browser did not move to another page, including the call stack. For instance:

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

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

a(789, "boo!");

</script>

So eventually you can hack it and access the original anchor. I suggest you do the following:

  • Write a function to be invoked in the OnBegin.
  • Inside this function, access the original triggerElement, and add it as a property to the original ajaxOptions (which can be accessed, too)
  • Then, in the OnSuccess function, access your hacked property of ajaxOptions.

这篇关于ASP.NET MVC - 取得的onSuccess函数参考“triggerElement”?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆