【发布时间】:2016-01-09 09:55:32
【问题描述】:
我在这个项目中使用 Visual Studio 2015 社区版和 AngularJS 1.4.7。
ProductAPIController.cs
public class ProductAPIController : ApiController
{
[HttpGet]
public IQueryable<Product> MyProducts()
{
List<Product> p = new List<Product>() { new Product {ProductName ="abc", Id = 1, Description = "Desc 1" },
new Product {ProductName ="def", Id = 2, Description = "Desc 2" },
new Product {ProductName ="ghi", Id = 3, Description = "Desc 3" } };
return p.AsQueryable();
}
}
Product.cs
public class Product
{
public int Id { get; set; }
public string ProductName { get; set; }
public string Description { get; set; }
}
app.module.js 按照最佳实践here
中的建议,我为应用模块使用了单独的文件(function () {
'use strict';
angular.module('app', ['ngCookies', 'ngRoute'])
})();
homeCtrl.js
这里我在同一个文件中同时使用了服务和控制器。我什至尝试在单独的文件中使用它,但它仍然不起作用。
(function () {
'use strict';
angular.module('app')
.controller('homeCtrl', ['$scope', '$http', 'ProductService', '$location', function homeCtrl($scope, $http, ProductService, $location) {
$scope.products = [];
$scope.getProducts = function () {
ProductService.getProducts().then(function (response) {
$scope.products = response.data;
}, function (err) {
alert(err);
});
};
}])
.service('ProductService', ['$http', function ($http) {
this.getProducts = function () {
return $http.get('/api/ProductAPI');
};
}]);
})();
index.cshtml
这里我用data-ng-repeat="item in products"
<div class="row" ng-app="app">
<div class="col-md-12" ng-controller="homeCtrl">
<div class="row">
<div class="col-md-12">
<form id="test">
<div data-ng-repeat="item in products">
<div class="col-sm-4 column productbox">
<div class="producttitle">{{item.ProductName}}</div> <div class="action"></div>
<div class="productprice">
<div class="pull-right">
<div >{{item.Id}}</div>
<a href="" class="btn btn-danger btn-sm" role="button"><span class="glyphicon glyphicon-arrow-right"></span> Get Quote</a>
</div>
<div class="pricetext">{{item.Description}}</div>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
@section scripts
{
@Scripts.Render("~/Scripts/angular.js")
@Scripts.Render("~/Scripts/angular-cookies.min.js")
@Scripts.Render("~/Scripts/angular-route.js")
@Scripts.Render("~/Ng/app.module.js")
@Scripts.Render("~/Ng/homeCtrl.js")
}
我尝试了几种不同的方法,但都失败了。我在这里做错了什么?
编辑
我已将示例项目上传到 GitHub here 。下载后您可能需要重新构建项目以同步相关包。
编辑:回答
为了以后参考,如果像我这样的AngularJS初学者正在看这个问题,答案如下。 基于@Miyuru Ratnayake 给出的accepted answer,刚刚更改了
$scope.getProducts = function () {
......
}
到
function getProducts() {
...
}
并称之为before the function 声明。不需要单独的函数 activate()。
所以控制器是这样的:
.controller('homeCtrl', ['$scope', '$cookies', '$http', 'ProductService', '$location', function homeCtrl($scope, $cookies, $http, ProductService, $location) {
$scope.products = [];
getProducts();
function getProducts() {
ProductService.getProducts().then(function (response) {
$scope.products = response.data;
}, function (err) {
alert(err);
});
};
}])
【问题讨论】:
-
您看到任何错误吗?当你从浏览器访问 yoursite/api/productapi 时会发生什么,你得到数据了吗?
-
为什么返回 IQueryable?只需返回列表即可。
-
查看浏览器网络控制台是否有错误。很可能被命中的端点不正确。
-
@Crowcoder,仍然更改为 List 并不能解决问题。它不返回数据。它是 IQuueryable,因为我刚刚从另一个项目中复制。我的问题在于角度服务调用。
-
@user1068538 将其更改为 list 在这里不会有什么不同,因为序列化程序将解析您的 IQueryable。然而,其他的问题是正确的。您实际收到了哪些错误消息?
标签: c# asp.net angularjs asp.net-mvc-4 asp.net-web-api2