在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#函数。我的项目树如下所示:
当我添加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
答案 0 :(得分:1)
请参考此Razor Pages in ASP.NET Core documentation,在这里他们提到了文件名和路径映射及其匹配的URL。
例如。
/Pages/Index.cshtml => /或/ Index
/Pages/Contact.cshtml => / Contact
另一件事是Razor Pages遵循特定的命名约定。它以“ 打开”为前缀,后跟HTTP动词,如OnGet()
,OnPost()
等。但是,我们也可以指定自定义名称。例如-
现在,如果我们谈论您的案件,那么您需要在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