ASP.NET MVC - 取得的onSuccess函数参考“triggerElement”? [英] ASP.NET MVC - Get reference to 'triggerElement' in onSuccess function?
问题描述
是有可能得到与调用的函数的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 originalajaxOptions
(which can be accessed, too) - Then, in the
OnSuccess
function, access your hacked property ofajaxOptions
.
这篇关于ASP.NET MVC - 取得的onSuccess函数参考“triggerElement”?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!