1

如何Ajax.ActionLink从其OnBegin功能中引用单击?

cshtml

@Ajax.ActionLink(
    typeName,
    "OrderQueueRows",
    new 
    {
        typeNames = Model.Name,
        includeDerivedTypes = ViewBag.IncludeDerivedTypes,
        excludeCompletedOrders = ViewBag.ExcludeCompletedOrders
    },
    new AjaxOptions {
        LoadingElementId="ajax-loading",
        OnBegin = "highlightFilter",
        UpdateTargetId = "order-queue-body"
    },
    new { @class = "show-exclusively" })

javascript

function highlightFilter() {
    $link = $(this);
    $link.css('color', 'red');
    $link.siblings().not($link).css('color', '');
}
4

2 回答 2

2

您无法使用开箱即用的Ajax.*助手实现此目的,因为它们不会将元素传递给onBeforeSend回调。微软实现它的方式,他们传递xhr对象而不是element被点击的对象。因此,一种可能性是修改jquery.unobtrusive-ajax.js脚本以便将此信息传递给回调。beforeSend在第 85 行,您将在回调中看到以下内容:

result = getFunction(element.getAttribute("data-ajax-begin"), ["xhr"]).apply(this, arguments);

您所要做的就是像这样修改它:

result = getFunction(element.getAttribute("data-ajax-begin"), ["xhr"]).apply(element, arguments);

如果您需要在OnBegin回调中同时包含元素和 xhr 对象:

result = getFunction(element.getAttribute("data-ajax-begin"), ["xhr"]).apply({ xhr: this, element: element }, arguments);

现在,您的代码将开始工作this并将代表元素:

function highlightFilter() {
    $link = $(this);
    $link.css('color', 'red');
    $link.siblings().not($link).css('color', '');
}

另一种可能性是简单地将 Ajax.ActionLink 替换为标准的 Html.ActionLink,然后编写相应的 jQuery 代码来订阅 .click 事件并触发 AJAX 请求。就个人而言,这可能是我会做的。

于 2012-06-28T18:02:03.383 回答
1

这现在在 ASP.NET MVC 5.1 中得到修复,使用来自另一个 stackoverflow 问题的方法:How to use $(this) inside MVC3 Ajax.ActionLink OnBegin,OnComplete Events

于 2014-01-21T13:50:49.760 回答