0

我正在尝试从 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>

}

将此页面放在 Pages/Products/Index.cshtml(.cs) 文件夹中

4

1 回答 1

0

我通常使用 razor 函数来生成 URL,而不是在 js 中对它们进行硬编码。如果您的操作甚至没有被触发,假设您不是意外处于发布模式,那是因为 URL 没有指向正确的位置。首先在 razor 中设置 js 变量,如下所示:

var productsURL = @Url.Context("~/products");

还可以在浏览器中运行 yourdomain/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,第二种选择将比第一种要慢。

于 2017-12-03T16:45:08.033 回答