@Ajax.ActionLink 在 ASP.NET 5 MVC6

@Ajax.ActionLink in ASP.NET 5 MVC6

我正在使用 ASP.NET 5 RC1。

ASP.NET 5 MVC 6@Ajax.ActionLink

的等价物是什么

示例:

@Ajax.ActionLink("Show", 
             "Show", 
             null, 
             new AjaxOptions { HttpMethod = "GET", 
             InsertionMode = InsertionMode.Replace, 
             UpdateTargetId = "dialog_window_id", 
             OnComplete = "your_js_function();" })

用于 ASP.NET 4 MVC 5.

我得到:

The name 'Ajax' does not exist in the current context.

ASP.NET 5

更新:

我知道它不会被实施。是否有人可以向我提供 taghelper 代码示例替代方案?

AjaxHelper 未在 ASP.NET 5 中实施 GitHub issue

根据 ASP.NET 团队的评论,他们似乎想将它包含在一个版本中,但他们没有时间去做。

说明

我会在这里说它不是一个帮手。

这是一个组件。它不仅是 HTML,而且是 JavaScript。将 JavaScript 绑定到组件后,您使用的是哪个框架?您使用的是纯 JavaScript 吗?

如果此组件绑定到纯 JavaScript(没有 jQuery),则每个浏览器的所有当前、以前和未来版本都需要 updated/tested。

这就是为什么我认为它是作为一个组件构建的,而不是构建到框架本身中的。

移动的部分太多,对 frameworks/software 的依赖太多,客户端可以而且将会更改。

解决方案

至于解决方案,我的建议是使用 jQuery 或类似的方法。

HTML

<a class="ajaxLink" href="#" data-href="/Project" data-method="DELETE">Delete Project</a>

JavaScript

$(document).ready(function() {
    $("a.ajaxLink").on('click', function (){
        var self = this;
        $.ajax({
            type: $(this).attr('data-method'),
            url: $(this).attr('data-href')
        }).then(function() {
            // success callback
        });
    });
});

如您所见,这很容易成为一个简单的客户端解决方案,而不是服务器端解决方案。

我希望这能回答您的问题并解决您的问题。

您可以使用带 data_ajax 参数的常规 html 助手,如下所示:

@Html.ActionLink("Link title", "Action", "Controller", null, new
{
   data_ajax = "true",
   data_ajax_method = "GET",
   data_ajax_mode = "replace",
   data_ajax_update = "#update-container"
})

MVC 5 剃刀语法

@Ajax.ActionLink(" ", "Edit", new { id = Model[i].RoleID }, 
   new AjaxOptions { UpdateTargetId = "partial-render", 
     InsertionMode = InsertionMode.Replace, HttpMethod = "GET" },
     new { @class = "glyphicon glyphicon-pencil btn-sm approved", })

<a asp-action="Edit" asp-controller="Account" asp-route-area="Global"
   asp-route-id="@item.RoleID "
   data-ajax="true" data-ajax-method="GET"
   data-ajax-mode="replace"
   data-ajax-update="#partial-render"
   class="glyphicon 
   glyphicon-pencil btn-sm"></a>

 @Ajax.ActionLink(" ", "Edit", new { id = Model[i].RoleID }, new AjaxOptions { UpdateTargetId = "ze-partial-render", InsertionMode = InsertionMode.Replace, HttpMethod = "GET" }, new { @class = "glyphicon glyphicon-pencil btn-sm approved", })



<a asp-action="Edit" asp-controller="Account" asp-route-area="Global" asp-route-id="@item.RoleID " data-ajax="true" data-ajax-method="GET" data-ajax-mode="replace" data-ajax-update="#ze-partial-render"  class="glyphicon glyphicon-pencil btn-sm"></a>

我发现这里的其他答案非常有帮助,所以我从他们那里借来了一些帮助代码来简化过渡,同时我最终在这个项目上从 Unobtrusive AJAX 迁移。

虽然我可以创建类似 Html.AjaxActionLink 的方法,但我查看了该方法所具有的愚蠢的重载数量,并表示对于一个小项目来说,这将是一个可维护性混乱。因此,我创建了一个名为 AjaxOptions 的小 DTO,我可以将其传递给 Html.ActionLink 方法。首先,这是 DTO...

public sealed class AjaxOptions
{
    public HttpMethod HttpMethod { get; set; } = HttpMethod.Get;
    //public InsertionMode InsertionMode { get; set; } // I left this out because my code only ever uses Replace
    public string UpdateTargetId { get; set; }
    public string OnBegin { get; set; }
    public string OnSuccess { get; set; }
    public string OnComplete { get; set; }

    public object ToAttrs(object htmlAttributes = null)
    {
        var dictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
        dictionary["data-ajax"] = "true";
        dictionary["data-ajax-method"] = HttpMethod.ToString().ToUpper();
        if (UpdateTargetId != null)
        {
            dictionary["data-ajax-mode"] = "replace";
            dictionary["data-ajax-update "] = '#' + UpdateTargetId;
        }
        if (OnBegin != null)
            dictionary["data-ajax-begin"] = OnBegin;
        if (OnSuccess != null)
            dictionary["data-ajax-success"] = OnSuccess;
        if (OnComplete != null)
            dictionary["data-ajax-complete"] = OnComplete;
        return dictionary;
    }
}

这让我可以像这样对 Html.ActionLink 进行很好的调用...

@(Html.ActionLink("Add Endorsement", "_CreateEndorsement", new { certificateId = Model.Id },
  new AjaxOptions { UpdateTargetId = "modal-content", OnSuccess = "OnEditModalOpened" }
    .ToAttrs(new { id = "create-endorsmeent-link" })))

不得不调用 .ToAttrs 可能看起来有点矫揉造作,但我看了看用动态和匿名对象做的花哨的东西,我很快得出结论这是更干净的解决方案,特别是考虑到我希望把所有这些都扔掉接下来几个月支持“适当的”AJAX 调用。

注意:重新使用此代码时,请注意硬编码选项,并根据需要为您的代码调整它们。我没有涵盖原始 AjaxOptions class!

中存在的所有可能选项(属性)
@Ajax.ActionLink("Verify", "VeriFyPackage", "Admin", new { RequestID = item.RequestID }, new AjaxOptions { UpdateTargetId = "getpackage" }, new { @class = "btn btn-success" })