我正在尝试从ASP.NET Core 2.0中的Razor Pages获取一些数据。
但问题是它不会返回任何数据。 我也试过调试它,它根本不会触发那个方法(OnGetProducts)。
模型Index.cshtml.cs:
private IProductRepository _productRepository;
public IndexModel(IProductRepository repository)
{
_productRepository = repository;
}
public void OnGet()
{
}
public IActionResult OnGetProducts(int page)
{
var model = _productRepository.GetProducts().Skip(page * 10).Take(10);
return new JsonResult(model);
}
剃刀页面Index.cshtml
<div id="products">
</div>
@section scripts{
<script>
$(function () {
getProducts(0);
});
var isInitialized = false;
function getProducts(page) {
$.ajax({
type: 'GET',
url: "Products",
contentType: "application/json",
dataType: "json",
data: {
handler: 'Products',
page: page
},
success: function (datas) {
console.log(datas);
}
});
}
</script>
}
P.S。此页面位于文件夹Pages / Products / Index.cshtml(.cs)
中答案 0 :(得分:0)
我通常使用razor函数生成URL而不是在js中对它们进行硬编码。如果您的操作甚至没有被触发,假设您没有意外处于发布模式,这是因为URL未指向正确的位置。首先在razor中设置js变量,如下所示:
var productsURL = @Url.Context("~/products");
还可以在浏览器中运行您的域名/产品,如果您获得404.
或者我使用此函数直接在js中使用c#对象:
public static IHtmlContent ToJS(this IHtmlHelper htmlHelper, object obj)
=> htmlHelper.Raw(JsonConvert.SerializeObject(obj));
在静态类中创建此函数,您还可以直接创建一个js对象:
<script>
var products = @Html.ToJS(repository.GetProducts().Skip(page * 10).Take(10));
</script>
当然这只会在页面加载中创建对象,如果你希望它在页面加载后改变,你可以考虑通过ajax创建一个局部视图。另请注意,第二种替代方案将比ajax的第一种方案慢。