无法将具有 ajax 的数据传递到剃刀页面
Cannot pass data with ajax to razor pages
我正在尝试将一些数据发送到剃刀页面方法,但问题是在方法中它总是采用 0
。
代码如下:
剃刀页面:
public IActionResult OnGetProducts(int page)
{
var products = _productRepository.GetProducts();
decimal pagesInDecimal = (products.Count() / 18);
var totalPages = pagesInDecimal % 1 == 0 ? pagesInDecimal : pagesInDecimal + 1;
products = products.Skip((page - 1) * 20).Take(20);
return new JsonResult(new {
totalPages = totalPages,
products = products
});
}
Ajax:
getProducts(1);
function getProducts(page) {
$.ajax({
type: 'GET',
url: "/Products",
contentType: "application/json; charset=utf-8",
dataType: "json",
data: {
page: page,
handler: 'Products'
},
beforeSend: function (xhr) {
xhr.setRequestHeader("XSRF-TOKEN",
$('input:hidden[name="__RequestVerificationToken"]').val());
},
success: function (datas) {
console.log(datas);
}
});
}
page
本质上是使用 ASP.NET Core 2.0 Razor Pages 时的保留名称。你的问题其实很简单,但也很微妙:
当它看到 query-string 参数时,ASP.NET Core 2.0 Razor Pages 框架将其解释为当前 Razor 页面的名称 - 如果您更改 page
参数键入 string
;它实际上包含当前页面的名称。在您的情况下,因为类型是 int
,model-binding 进程无法将字符串(名称)绑定到数字,因此将其设置为 0
.
解决此问题的一种方法是使用不同的名称。例如:
public IActionResult OnGetProducts(int pageNumber)
-和-
data: {
pageNumber: page,
handler: 'Products'
}
在 Github 上围绕 这个问题进行了相当多的讨论,但它并不特定于您的情况。我建议您搜索或提出一个专门讨论在 Razor 页面中使用 query-string 参数的新问题。
作为不相关的旁注,您不需要在 $.ajax
请求中设置 Content-Type
header - 这在您发送内容时使用,您不是。
我正在尝试将一些数据发送到剃刀页面方法,但问题是在方法中它总是采用 0
。
代码如下:
剃刀页面:
public IActionResult OnGetProducts(int page)
{
var products = _productRepository.GetProducts();
decimal pagesInDecimal = (products.Count() / 18);
var totalPages = pagesInDecimal % 1 == 0 ? pagesInDecimal : pagesInDecimal + 1;
products = products.Skip((page - 1) * 20).Take(20);
return new JsonResult(new {
totalPages = totalPages,
products = products
});
}
Ajax:
getProducts(1);
function getProducts(page) {
$.ajax({
type: 'GET',
url: "/Products",
contentType: "application/json; charset=utf-8",
dataType: "json",
data: {
page: page,
handler: 'Products'
},
beforeSend: function (xhr) {
xhr.setRequestHeader("XSRF-TOKEN",
$('input:hidden[name="__RequestVerificationToken"]').val());
},
success: function (datas) {
console.log(datas);
}
});
}
page
本质上是使用 ASP.NET Core 2.0 Razor Pages 时的保留名称。你的问题其实很简单,但也很微妙:
当它看到 query-string 参数时,ASP.NET Core 2.0 Razor Pages 框架将其解释为当前 Razor 页面的名称 - 如果您更改 page
参数键入 string
;它实际上包含当前页面的名称。在您的情况下,因为类型是 int
,model-binding 进程无法将字符串(名称)绑定到数字,因此将其设置为 0
.
解决此问题的一种方法是使用不同的名称。例如:
public IActionResult OnGetProducts(int pageNumber)
-和-
data: {
pageNumber: page,
handler: 'Products'
}
在 Github 上围绕 这个问题进行了相当多的讨论,但它并不特定于您的情况。我建议您搜索或提出一个专门讨论在 Razor 页面中使用 query-string 参数的新问题。
作为不相关的旁注,您不需要在 $.ajax
请求中设置 Content-Type
header - 这在您发送内容时使用,您不是。