【问题标题】:ASP .NET Core 3.0 Razor Pages generate dynamic href url for AJAX with @Url.PageASP .NET Core 3.0 Razor Pages 使用 @Url.Page 为 AJAX 生成动态 href url
【发布时间】:2020-03-23 02:17:33
【问题描述】:

我有一个锚标记,在 onclick 上有一个 javascript 函数,调用我的方法通过 Ajax 更新页面。

页面显示订单的详细信息,ajax 更新显示详细订单的位置。

问题是:如何动态生成和传递 URL?

这是我的锚标记:

<a class="nav-link text-dark text-center p-0 collapsed"
   data-toggle="collapse"
   data-target="#Details"
   aria-expanded="true"
   aria-controls="Details"
   href="@Url.Page("Area/Details/" + @Model.wItem.GUID,  "ShowDetails")"                                           
   id="ShowDetails"
   onclick="ShowDetailsAjax(this, '@Model.wItem.GUID')">
   @item.Position
</a>

这是我的 javascript 函数:

function ShowPositionAjax(x, _GUID) {

    var _url = '';
    var _position = x.outerText;
    var parameters = "{'position':'" + _position + "','GUID':'" + _GUID + "'}";

    $.ajax({
        url: _url,
        type: 'GET',
        cache: false,
        async: true,
        headers: {
            RequestVerificationToken:
                $('input:hidden[name="__RequestVerificationToken"]').val()
        },
        data: parameters
    })
        .done(function (result) {
            $('#MainframeContents').html(result);
        });
}

定位标签所在的剃须刀页面名为 Area/Details/123456-45646-123132(其中 123456-45646-123132 是 GUID)。问题是,我不想硬编码 url,因为 GUID 可以改变。

我试过了

href="@Url.Page("Area/Details/" + @Model.wItem.GUID,  "ShowDetails")"

但在 javascript 中,href 为空。

【问题讨论】:

    标签: javascript jquery ajax asp.net-core razor-pages


    【解决方案1】:

    我在这里发布解决方案;这比在评论中要好。

    原来我用这个href:

    href="@Url.Page("Area/Details/" + @Model.wItem.GUID,  "ShowDetails")">  
    

    使用 Url.Page 因为我使用的是 Razor 而不是 MVC。 阅读 MS doc(https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/areas?view=aspnetcore-3.0) 我注意到我正在使用 areas 所以,正确的 href 应该是:

    href='@Url.Page("Details", "ShowDetails",  new { area = "Area", position = item.Position, GUID = @Model.wItem.GUID })'
    

    详情:是我的主页名称

    ShowDetails:是我的 GET 处理程序的名称

    区域:是我所在区域的名称

    positionGUID:是我的 GET 处理程序的参数

    结果 href URL 将类似于:

    /zh/Area/Details/45646546-1213-156416-45646-5464666?position=1&handler=ShowDetails

    调用我的处理程序:

    public async Task<IActionResult> OnGetShowDetailsAsync(string GUID, string position)
    {
        ...
    }
    

    希望这可以节省其他人的时间。

    感谢@Rory McCrossan 的建议。

    【讨论】:

      【解决方案2】:

      您可以使用href 属性来执行此操作。你说它对你不起作用,但你还没有展示你尝试过的东西。使用 attr() 将为您提供所需的值。您似乎还试图在不太正确的 GET 请求中发送 JSON,尤其是当您需要的数据已经在 href URL 中时。

      还请注意,您应避免使用onclick 和其他事件属性,因为它们已过时。当您使用 jQuery 时,您可以轻松地不显眼地附加您的事件处理程序。

      最后,async: false 是非常糟糕的做法,不应使用。在任何情况下都不需要它,因为您已经实现了 done() 方法。说了这么多,试试这个:

      <a class="nav-link text-dark text-center p-0 collapsed"
        data-toggle="collapse"
        data-target="#Details"
        aria-expanded="true"
        aria-controls="Details"
        href="@Url.Page("Area/Details/" + @Model.wItem.GUID,  "ShowDetails")">       
        @item.Position
      </a>
      
      jQuery(function($) {
        $('.nav-link').on('click', function(e) {
          e.preventDefault(); // stop the standard link behaviour
          $.ajax({
            url: $(this).attr('href'),
            type: 'GET',
            cache: false,
            headers: {
                RequestVerificationToken:  $('input:hidden[name="__RequestVerificationToken"]').val()
            }
          }).done(function(result) {
            $('#MainframeContents').html(result);
          });
        });
      });
      

      【讨论】:

      • 我已经复制并粘贴了您的代码,但 $(this).attr('href') 未定义。而且我不使用 async: false 但 async: true。
      • 我无法复制,这个逻辑可以正常工作:jsfiddle.net/RoryMcCrossan/uda32t9e。检查以确保您的 HTML 有效。
      • 我没有使用 MVC,这就是我使用 Page 而不是 Action 的原因。我将检查 html 代码,搜索为什么在我的代码中未定义 href。
      • 啊,是的。对不起,我错过了那个标签
      猜你喜欢
      • 2019-01-03
      • 1970-01-01
      • 2019-10-12
      • 2018-11-08
      • 1970-01-01
      • 2021-05-29
      • 2018-10-16
      • 2018-03-30
      • 2019-07-25
      相关资源
      最近更新 更多