Asp.net core @ASP.NET 5 MVC6中的Ajax.ActionLink

Asp.net core @ASP.NET 5 MVC6中的Ajax.ActionLink,asp.net-core,asp.net-core-mvc,Asp.net Core,Asp.net Core Mvc,我正在使用ASP.NET5RC1 在@Ajax.ActionLink 例如: @Ajax.ActionLink("Show", "Show", null, new AjaxOptions { HttpMethod = "GET", InsertionMode = InsertionMode.Replace, UpdateTargetId = "dialog_

我正在使用ASP.NET5RC1

@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
中使用

我得到:

当前上下文中不存在名称“Ajax”

在ASP.NET 5中

更新:

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

ASP.NET 5中未实现的
AjaxHelper有一个开放的窗口

从ASP.NET团队的评论来看,他们似乎希望将其包含在发布版中,但他们没有考虑到这一点

解释 我会在这里说,在这一点上,它不是一个助手

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

如果该组件绑定到纯JavaScript(无jQuery),则需要针对每个浏览器的所有当前、以前和将来版本对其进行更新/测试

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

太多的移动部件,太多的对框架/软件的依赖,客户可以并且将要改变

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

HTML

<a class="ajaxLink" href="#" data-href="/Project" data-method="DELETE">Delete Project</a>
正如您所看到的,这很容易成为一个简单的客户端解决方案,而不是服务器端解决方案


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

您可以使用带有数据\u 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(“,”编辑),新的{id=Model[i].RoleID},
新的AjaxOptions{UpdateTargetId=“部分渲染”,
InsertionMode=InsertionMode.Replace,HttpMethod=“GET”},
新的{@class=“Glypicon铅笔btn sm已批准”,})
@Ajax.ActionLink(“,”编辑),新的{id=Model[i].RoleID},新的AjaxOptions{UpdateTargetId=“ze-partial render”,InsertionMode=InsertionMode.Replace,HttpMethod=“GET”},新的{@class=“Glypicon铅笔btn-sm-approved”,})

我发现这里的其他答案非常有用,所以我从他们那里借用了一些帮助代码,以便在我最终从不引人注目的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类中存在的所有可能选项(属性)

我可能错了,但我不认为这是在MVC6中实现的。您需要创建自己的a标记并自己实现ajax调用,这非常容易实现。基本上在页面中包含不引人注目的ajax脚本,并制作一个taghelper,它可以使用脚本将使用的所需数据ajax*属性装饰链接,或者直接在标记中添加数据ajax*属性,而不使用自定义taghelper。我基本上只想在div id标记中加载部分页面。我使用ActionLink和AjaxOptions来做一些事情。我想我可以使用我添加到onclick事件中的纯jqueryajax。另外,如果我的答案解决了您的问题,请将其标记为“已回答”,以便下一个用户可以轻松找到。尽管此代码可能会回答此问题,但提供有关为什么和/或如何回答此问题的附加上下文将显著提高其长期价值。请在你的回答中添加一些解释。这些下划线不应该是连字符吗?i、 e.“数据阿贾克斯”应该是“数据阿贾克斯”?
@(Html.ActionLink("Add Endorsement", "_CreateEndorsement", new { certificateId = Model.Id },
  new AjaxOptions { UpdateTargetId = "modal-content", OnSuccess = "OnEditModalOpened" }
    .ToAttrs(new { id = "create-endorsmeent-link" })))