带有 mvc 核心的 Ajax.ActionLink 替代方案

Posted

技术标签:

【中文标题】带有 mvc 核心的 Ajax.ActionLink 替代方案【英文标题】:Ajax.ActionLink alternative with mvc core 【发布时间】:2016-08-28 16:48:53 【问题描述】:

在 MVC5 中,@Ajax.ActionLink 可用于仅更新部分视图而不是重新加载整个视图。显然在 MVC6 中不再支持。

我尝试过使用@html.ActionLink,如下所示,但它不会更新表单,它只返回部分视图:

查看:

@Html.ActionLink("Update", "GetEnvironment", "Environments", new  id = Model.Id , new
       
           data_ajax = "true",
           data_ajax_method = "GET",
           data_ajax_mode = "replace",
           data_ajax_update = "environment-container",
           @class = "btn btn-danger"
       ) 

控制:

public async Task<ActionResult> GetEnvironment(int? id)


        var environments = await _context.Environments.SingleOrDefaultAsync(m => m.Id == id);
        return PartialView("_Environment",environments);
 

局部视图:

@model PowerPhysics.Models.Environments
this is a partial view

然后我尝试使用 ViewComponents。当页面加载组件正常工作但我不明白之后如何刷新组件(例如使用按钮):

查看:

@Component.InvokeAsync("Environments", new  id = Model.Id ).Result

组件:

public class EnvironmentsViewComponent : ViewComponent

    public EnvironmentsViewComponent(PowerPhysics_DataContext context)
    
        _context = context;
    

    public async Task<IViewComponentResult> InvokeAsync(int? id)
    
        var environments = await _context.Environments.SingleOrDefaultAsync(m => m.Id == id);

        return View(environments);
    

如何在 MVC6 中使用 PartialViews 只更新视图的一部分?

【问题讨论】:

javascript 对返回局部视图的操作进行 ajax 调用。在ajax调用的成功回调中,从结果中获取html并更新你的容器。 是的,我可以使用 Javascript,但我想知道 MVC6 和 HMTL5 是否有更好的方法。也许我在代码中做错了什么。最重要的是,我想了解什么是最佳做法。 【参考方案1】:

你可以使用如下标签:

 <a data-ajax="true"
                       data-ajax-loading="#loading"
                       data-ajax-mode="replace"
                       data-ajax-update="#editBid"
                       href='@Url.Action("_EditBid", "Bids", new  bidId = Model.BidId, bidType = Model.BidTypeName )'
                       class="TopIcons">Link
                        </a>

确保您在 _Layout.cshtml 页面的正文标记末尾有以下脚本标记:

<script src="~/lib/jquery/jquery.unobtrusive-ajax/jquery.unobtrusive-ajax.js"></script>

【讨论】:

为什么 data-ajax="true" 阻止获取文件。有人知道吗?删除后,代码可以正常工作...【参考方案2】:

ViewComponent 不能替代 ajaxified 链接。它更像Html.Action 调用以将子操作包含到您的页面(例如:加载菜单栏)。这将在 razor 执行视图的页面时执行。

在撰写本文时,aspnet 核心中没有对 ajax 操作链接替代方案的官方支持。

但好的是,我们可以用很少的 jQuery/javascript 代码来做 ajaxified 的东西。您可以使用现有的 Anchor 标签助手来做到这一点

<a asp-action="GetEnvironment"  asp-route-id="@Model.Id" asp-controller="Environments" 
                                 data-target="environment-container" id="aUpdate">Update</a>
<div id="environment-container"></div>

在 javascript 代码中,只需监听链接点击并进行调用并更新 DOM。

$(function()

   $("#aUpdate").click(function(e)

     e.preventDefault();
     var _this=$(this);
     $.get(_this.attr("href"),function(res)
         $('#'+_this.data("target")).html(res);
     );

   );

);

由于您在查询字符串中传递参数,因此您也可以使用 jQuery load 方法。

$(function()

   $("#aUpdate").click(function(e)

     e.preventDefault();
     $('#' + $(this).data("target")).load($(this).attr("href"));

   );

);

【讨论】:

谢谢,我试过了,但是当我点击链接时,它进入了js函数,但它没有调用控制器中的动作。 $(this).data("target") 包含:"#environment-container",$(this).attr("href") 包含:"/Environments/GetEnvironment/3" 打开你的浏览器控制台(网络和控制台),看看是否有任何 js 错误或者它正在进行网络调用。您可以看到网络调用的响应【参考方案3】:

我在 ASP.NET MVC Core 中为 Anchor TagHelper 添加了 ajax 选项

您可以在 github 链接中看到完整的示例: https://github.com/NevitFeridi/AJAX-TagHelper-For-ASP.NET-Core-MVC

使用这个新的 tagHelper 后,你可以很容易地在锚点中使用 ajax 选项,如下所示:

     <a asp-action="create" asp-controller="sitemenu" asp-area="admin"
                        asp-ajax="true"
                        asp-ajax-method="get" 
                        asp-ajax-mode="replace"
                        asp-ajax-loading="ajaxloading"
                        asp-ajax-update="modalContent"
                        asp-ajax-onBegin="showModal()"
                        asp-ajax-onComplete=""
                        class="btn btn-success btn-icon-split">
                        <span class="icon text-white-50"><i class="fas fa-plus"></i></span>
                        <span class="text"> Add Menu </span>
  </a>

【讨论】:

感谢您的项目。我将它实施到我的项目中并且它工作正常。【参考方案4】:

改用标签助手,并确保在您的视图文件夹中包含 _ViewImport。

注意:如果有多个链接指向将更新您的 DIV 的不同页面,请确保使用 document.getElementsByName。

示例 - 剃刀页面

<script type="text/javascript" language="javascript">
    $(function () 
        var myEl = document.getElementsByName('theName');
        $(myEl).click(function (e) 

            e.preventDefault();
            var _this = $(this);
            $.get(_this.attr("href"), function (res) 
                $('#' + _this.data("target")).html(res);
            );
        );
    );
</script>
<a asp-action="Index" asp-controller="Battle" data-target="divReplacable" name="theName" >Session</a>
<a asp-action="Index" asp-controller="Peace" data-target="divReplacable" name="theName" >Session</a>


<div id="divReplacable">
    Some Default Content
</div>

【讨论】:

以上是关于带有 mvc 核心的 Ajax.ActionLink 替代方案的主要内容,如果未能解决你的问题,请参考以下文章

带有 mvc 核心的 Ajax.ActionLink 替代方案

带有反应模板的 Asp.net 核心 Web 应用程序:在开发中,服务器首先检查 mvc 路由,但在生产中服务器仅返回 index.html

HTTP 错误 405 | [HttpPost] ASP.NET MVC 核心 3.1

使用 EF 框架的 .NET 核心 MVC - 将数据从一个控制器传递到另一个控制器

带有 spotify 身份验证回调 url 的 Aspnet Core MVC 应用程序重定向到 127.0.0.1

Asp.net core MVC post 参数始终为空