【问题标题】:Get a reference to the anchor element of an Ajax.ActionLink at the OnSuccess handler在 OnSuccess 处理程序中获取对 Ajax.ActionLink 锚元素的引用
【发布时间】:2013-05-09 04:29:47
【问题描述】:

基本上,我的问题与this 的问题相似甚至重复,只是我使用的是 MVC Razor。而且我确信那里的答案已经过时,因为当前使用的客户端库是 jQuery / unobtrusive ajax。

总结一下这个问题,我试图访问在提供的AjaxOptionsOnSuccess 属性中指定的处理程序中触发Ajax 请求的锚元素。

这里是ActionLink

@Ajax.ActionLink("Add opening times entry", "AddOpeningTimes", 
  new { htmlPrefix = Html.HtmlPrefixFor(m => Model.OpeningTimes) },
  new AjaxOptions { UpdateTargetId = "openingTimes",
    InsertionMode =  nsertionMode.InsertAfter,
    OnSuccess = "updateHtmlPrefix" },
  new { title = "Add opening times entry" })

JS:

function updateHtmlPrefix() {
  this.href = this.href.replace(/\d(?=]$)/, function (i) { return ++i; });
}

【问题讨论】:

    标签: ajax asp.net-mvc razor


    【解决方案1】:

    这是一个答案的链接,其中显示了几种解决方案和对该问题的良好解释。

    https://stackoverflow.com/a/1068946/1563373

    你总是可以写

     OnBegin="function() { clickedLink = $(this); }" 
    

    然后您可以在成功处理程序中访问 c​​lickedLink 变量(记得用页面范围声明它)。

    编辑:

    在使用调用堆栈后,您可以尝试以下操作:

    <script type="text/javascript">    
        function start(xhr) {        
            var stack = start.caller;
            // walk the stack
            do {
                stack = stack.caller;            
            } while (stack.arguments != undefined && stack.arguments.length > 0 && (stack.arguments[0].tagName == undefined || stack.arguments[0].tagName != "A"))
        //stack now points to the entry point into unobtrusive.ajax
        if (stack.arguments != undefined)
            xhr.originalElement = $(stack.arguments[0]);
    
        //blech        
    }
    
    function UpdateHrefText(result, status, xhr) {
        debugger;
        if(xhr.originalElement != undefined)
            xhr.originalElement.text(result.Message);
    }
    </script>
    
    
    @Ajax.ActionLink("Test", "Message", "Home", new AjaxOptions{ OnBegin = "start", OnSuccess = "UpdateHrefText"})
    

    但我不确定我是否会在生产中信任它。我会做更多类似的事情:

    <script type="text/javascript">
    var theLink;
    
    function start(xhr) {
        xhr.originalElement = theLink;        
    }
    
    function UpdateHrefText(result, status, xhr) {
        debugger;
        if(xhr.originalElement != undefined)
            xhr.originalElement.text(result.Message);
    }
    </script>
    
    
    @Ajax.ActionLink("Test", "Message", "Home", null, new AjaxOptions{ OnBegin = "start", OnSuccess = "UpdateHrefText"}, new { onclick="theLink = $(this);"})
    

    【讨论】:

    • 你是对的,我没有点击链接,抱歉。去年刚刚解决了这样的问题,我遇到了同样的问题,原来的目标没有前馈。链接答案中提供的解决方案现在仍然有效。
    • 我尝试了你的第一种方法,我调试了它,start 函数抛出以下错误:'"onMessageExternal" 只能在扩展进程中使用。有关详细信息,请参阅内容脚本文档。',当到达 updateHrefText 时,xhr.originalElement 未定义。
    • 看起来无法定义 xhr。有没有另一种不错的方法,我当然更喜欢避免使用外部全局变量。
    • 第一个示例有效 - 它到达元素,但 xhr.element 仍然是 undefined
    • 这两个示例在我测试时都有效。就第二个而言,全局变量是短暂的,因为它在 onbegin 中被访问并被推送到请求上下文中,因此用户单击另一个按钮必须快速(即闪电般快速)才能强制分配 btn在错误的上下文中,使它在我的书中非常安全。另一种选择是更改不显眼的 ajax 文件以将其添加到请求中。
    猜你喜欢
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    相关资源
    最近更新 更多