2017-12-02 181 views
0

我想从ASP.NET Core 2.0中的Razor页面获取一些数据。无法在Razor页面中使用ajax获取json数据

但问题是它不返回任何数据。 我也尝试调试它,它根本不会触发该方法(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)

+1

我的第一本能,如果我试图调试一个失败的ajax调用将设置错误回调,看看它是什么告诉我出错了...... –

+0

也在您的浏览器中点击F12,并看看网络选项卡+控制台。 – CalC

+0

我问了一个类似的问题,并最终得到它的工作(请参阅prev评论),但决定为AJAX调用创建Web API控制器是更简单和更好的方法。 –

回答

0

我通常使用razor函数来生成URL,而不是在js中对其进行硬编码。如果您的操作没有被触发,假设您并非意外地处于发布模式,这是因为该URL没有指向正确的位置。首先设定JS在剃刀像这样的变量:

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

而且运行YOURDOMAIN /产品在您的浏览器,如果你得到一个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的第一种方法要慢。

相关问题