在asp.net核心剃须刀页面应用程序中ajax调用C#函数的“ URL”是什么

时间:2019-04-12 07:50:59

标签: c# asp.net-core razor .net-core razor-pages

在Visual Studio中ASP.NET Core Razor Pages项目的自动生成的site.js文件中,我试图用Ajax调用

    $.ajax
        ({
            type: "POST",
            url: "",
            data: "asdsad",
            dataType: "text",
            success: function (result) {
                alert(result);
            },
            error: function (status, ex) {
                alert("Error Code: Status: " + status + " Ex: " + ex);
            }
        });

一个C#函数。我的项目树如下所示:

ASP.NET Core Razor Pages project tree

当我添加builder.cshtml.cs页面时,Visual Studio也自动生成了builder.cshtml文件。在我的builder.cshtml.cs中有以下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace MyProjectName.Pages
{
    public class Index1Model : PageModel
    {
        public string Message { get; set; } = "Initial Request";
        public void OnGet()
        {
            Message = "Test1";
        }

        public void HelloFunc()
        {
            Message = "BuilderJob";
        }
    }
}

我添加了函数HelloFunc()Message变量。经过ASP.NET Core documentation by Microsoft之后,我不了解从我的Ajax代码调用HelloFunc的“ URL”是什么。它不是/builder/HelloFunc(无效)。如何通过我的Ajax调用访问此HelloFunc

答案是将HelloFunc更改为OnPostHelloFunc()并使用此url: /builder?handler=HelloFunc,如果您只是测试而不使用验证令牌,请插入[IgnoreAntiforgeryToken(Order = 1001)]按照此处的说明test .net core 2 page using Postman return 400 bad request

2 个答案:

答案 0 :(得分:1)

请参考此Razor Pages in ASP.NET Core documentation,在这里他们提到了文件名和路径映射及其匹配的URL。

例如。

/Pages/Index.cshtml => /或/ Index

/Pages/Contact.cshtml => / Contact

另一件事是Razor Pages遵循特定的命名约定。它以“ 打开”为前缀,后跟HTTP动词,如OnGet()OnPost()等。但是,我们也可以指定自定义名称。例如-

  • OnGetPatientList()
  • OnPostHelloFunc()

现在,如果我们谈论您的案件,那么您需要在builder.cshtml.cs文件中进行以下更改。

namespace MyProjectName.Pages
{
    public class Index1Model : PageModel
    {
        public string Message { get; set; } = "Initial Request";
        public void OnGet()
        {
            Message = "Test1";
        }

        public IActionResult OnPostHelloFunc()
        {
            return Content("BuilderJob");
        }
    }
}

和您的ajax函数如下所示-

$.ajax
({
    type: "POST",
    url: "/builder?handler=HelloFunc",
    dataType: "text",
    beforeSend: function (xhr) {
            xhr.setRequestHeader("XSRF-TOKEN",
                $('input:hidden[name="__RequestVerificationToken"]').val());
    },
    success: function (result) {
        alert(result);
    },
    error: function (status, ex) {
        alert("Error Code: Status: " + status + " Ex: " + ex);
    }
});

答案 1 :(得分:1)

Razor Pages为此使用了页面处理程序。因此,如果要发布到页面,请创建一个名称为OnPost{HandlerName}OnPost{HandlerName}Async的方法(如果它是异步方法)。

例如,如果您有表单并想要删除某些内容,则需要这样的页面处理程序:

public async Task<IActionResult> OnPostDeleteAsync(int id)
{
    var itemToDelete = await _mapRepo.GetByIdAsync(id);
    if (itemToDelete == null)
    {
        //...
    }

    await _mapRepo.Delete(itemToDelete);
    return RedirectToPage("Maps");
}

OnPost声明,asp.net核心将侦听POST请求,Delete是名称,而Async是异步处理程序的命名约定。

在您的表单中,您只需声明一个输入元素,它将在onclick事件期间调用此处理程序:

<button type="submit" class="btn btn-danger btn-block" asp-page-handler="Delete" asp-route-id="@Model.Id">Delete</button>

使用ajax执行此操作

$.ajax
({
    type: "POST",
    url: "/builder?handler=HelloFunc",
    dataType: "text",
    success: function (result) {
        alert(result);
    },
    error: function (status, ex) {
        alert("Error Code: Status: " + status + " Ex: " + ex);
    }
});

使用处理程序方法:

public void OnPostHelloFunc()
{
    //...
}

以下是有关命名处理程序的好书:https://www.learnrazorpages.com/razor-pages/handler-methods