首页 > 解决方案 > AJAX 调用是否会在 Razor Pages 中重新加载我的整个页面?

问题描述

我正在尝试从我的 Razor Pages 页面进行 AJAX 调用。

JavaScript:

$.ajax({
    type: 'POST',
    url: '?handler=Delete',
    data: {
        id: $(this).data('id')
    },
    beforeSend: function (xhr) {
        // Required for POST, but have same issue if I removed this
        // and use GET
        xhr.setRequestHeader('XSRF-TOKEN',
            $('input:hidden[name="__RequestVerificationToken"]').val());
    },
})
.fail(function (e) {
    alert(e.responseText);
})
.always(function () {
    // Removed to simplify issue
    //location.reload(true);
});

后面的代码:

public async System.Threading.Tasks.Task OnPostDeleteAsync(int id)
{
    string userId = UserManager.GetUserId(User);
    var area = DbContext.Areas.FirstOrDefault(a => a.UserId == userId && a.Id == id);
    if (area != null)
    {
        DbContext.Remove(area);
        await DbContext.SaveChangesAsync();
    }
}

而且,事实上,这可以正常工作并且该项目已被删除。

但是,$.ajax.fail()处理程序被调用并且错误表明存在NullReferenceException.

AJAX 错误

在我的标记(CSHTML 文件)中引发了异常:

@if (Model.ActiveAreas.Count == 0)  @***** NullReferenceException here! *****@
{
    <div class="alert alert-info">
        You don't have any active life areas.
    </div>
}

出现此异常的原因是因为我的页面模型的所有属性都是空的。它们为空,因为OnGetAsync()从未调用我的方法来初始化它们!

我的问题是为什么我的标记执行起来好像我正在更新整个页面?我正在做一个 AJAX 调用。我不想更新整个页面。所以我不知道为什么我OnGetAsync()需要被调用。

标签: c#jqueryajaxasp.net-corerazor-pages

解决方案


(根据您提供的代码)

我认为您的always()回调函数或Cliek事件或您的返回语句存在问题。

总是():

always()无论 AJAX 请求是成功还是失败,只要 AJAX 请求完成,就会调用传递给该函数的回调函数。传递给回调函数的三个参数将是传递给done()或的相同的三个参数fail(),这取决于 AJAX 请求是成功还是失败。

响应成功的请求,该函数的参数与.done(): data, textStatus, and the jqXHR object. 对于失败的请求,参数与 的参数相同.fail(): the jqXHR object, textStatus, and errorThrown

deferred.always()方法接收用于.resolve().reject()Deferred 对象的参数,这些参数通常非常不同。出于这个原因,最好只将它用于不需要检查参数的操作。在所有其他情况下,请使用显式.done().fail()处理程序,因为参数将具有众所周知的顺序。

参考:

  1. http://tutorials.jenkov.com/jquery/ajax.html

  2. https://api.jquery.com/jquery.ajax/

  3. https://api.jquery.com/deferred.always/

或者

Cliek 事件: 我认为您的按钮正在触发页面刷新。所以preventDefault()在你的点击事件中使用。

例子:

$('...').on('click', function (event) {

    event.preventDefault();//add the prevent default.

    //Your code

});

或者

返回声明:如果您的OnPostDelete方法返回Page(),请将其更改为JsonResultor RedirectToPage

例子:

   public Task<IActionResult> OnPostDelete(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }
            //Your Code

           return Page();//Remove it

           return new JsonResult ("Customer Deleted Successfully!");// Use some thing like it as u need.

            return RedirectToPage("./Index");//if u want to reload page then use it.
        }

推荐阅读