ASP .NET Core 3.0剃刀页面使用@ Url.Page为AJAX生成动态href网址

时间:2019-11-27 13:47:19

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

我有一个锚标记,该标记带有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中为null。

2 个答案:

答案 0 :(得分: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)时,我注意到我正在使用区域,因此,正确的href应该是:

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

详细信息:是我的页面的名称

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

区域:是我的区域的名称

position GUID :是我的GET处理程序的参数

结果href URL将类似于:

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

呼叫我的处理程序的

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

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

感谢@Rory McCrossan的建议。

答案 1 :(得分:0)

您可以使用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);
    });
  });
});