我尝试在VS 2010 Web应用程序中进行ASP.NET Web Api CRUD操作,但为什么结果不会从源表返回所有整行。
这是我的代码:
路线/ Globax.asax
protected void Application_Start(object sender, EventArgs e)
{
RouteTable.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}", // browse with localhost:7031/api/product
//routeTemplate: "{controller}/{id}", // browse with localhost:7031/product
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
Controller / ProductController.cs:
public class ProductController : ApiController
{
NorthwindEntities db = new NorthwindEntities();
public List<Product> GetAll()
{
return db.Products.ToList<Product>();// ;
}
查看/ ViewProduct.aspx:
<script src="Script/jquery-1.7.1.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(function () {
$('#<%= cviewproduct.ClientID %>').click(function (e) {
getProducts();
e.preventDefault();
});
});
function getProducts() {
$.getJSON("/api/product",
function (data) {
$.each(data, function (key, val) {
//var str = val.ProductName;
// alert(str);
var row = '<tr> <td>' + val.ProductName + '</td><td>' + val.ProductID + '</td><tr/>';
$(row).appendTo($('#tblproduct'));
});
});
}
</script>
Bellow是产品控制器的结果,通过“http://localhost:7031/api/product”:
Bellow是getProducts()函数的结果:
请帮帮我。
有任何想法或建议吗?
答案 0 :(得分:1)
当您执行$.getJSON("/api/product", ...
时,您没有收到您发布的XML。你回来了JSON。
作为第一步,我建议您下载并安装Fiddler2。打开它,然后使用Composer选项卡为http://localhost:7031/api/product
执行GET。这应该显示返回的JSON,它将与XML不同。将JSON发布到您的原始问题,我们应该能够进一步提供帮助。
我的猜测是JSON格式不正确。您的WebApiConfig.cs类是什么样的?
<强>更新强>
是的,还有更好的方法。首先,创建一个ApiModel(ApiModel是WebAPI,ViewModel是MVC):
public class ProductApiModel
{
public int ProductId { get; set; }
public string ProductName { get; set; }
}
现在,从控制器返回此而不是实体:
public class ProductController : ApiController
{
public IEnumerable<ProductApiModel> GetAll()
{
var products = db.Products
.OrderBy(x => x.ProductID)
.Select(x => new ProductApiModel
{
ProductId = x.ProductID,
ProductName = x.ProductName
});
return products;
}
}
如果您使用AutoMapper,则可以缩短控制器代码:
public class ProductController : ApiController
{
public IEnumerable<ProductApiModel> GetAll()
{
var entities = db.Products.OrderBy(x => x.ProductID);
var models = Mapper.Map<ProductApiModel[]>(entities);
return models;
}
}
答案 1 :(得分:0)
做了一些研究之后,我最终找到了(请纠正我,如果我错了): JavaScriptSerializer无法从关系序列化整个对象树 实体与其他实体之间(产品和类别)。
所以..我对我的代码进行了一些更改,结果是预期的
Controller / ProductController.cs:
来自:
public class ProductController : ApiController
{
NorthwindEntities db = new NorthwindEntities();
public List<Product> GetAll()
{
return db.Products.ToList<Product>();// ;
}
收件人:
public class ProductController : ApiController
{
public string GetAll()
{
var product = db.Products.OrderBy(x => x.ProductID).Select(x => new
{
ProductId = x.ProductID,
ProductName = x.ProductName
});
return JsonConvert.SerializeObject(product);
}
查看/ ViewProduct.aspx:
来自:
function getProducts() {
$.getJSON("/api/product",
function (data) {
$.each(data, function (key, val) {
var row = '<tr> <td>' + val.ProductName
+ '</td><td>' + val.ProductID + '</td><tr/>';
$(row).appendTo($('#tblproduct'));
});
});
收件人:
$.getJSON("/api/product",
function (data) {
var obj = $.parseJSON(data);
$.each(obj, function (key, val) {
var row = '<tr> <td>' + val.ProductId
+ '</td><td>' + val.ProductName + '</td><tr/>';
$(row).appendTo($('#tblproduct'));
});
});
或者......有比这更好的方法,
如果我仍想传递实体对象而不是字符串对象 (列出GetAll()...而不是GetAll string()....)
此致
安德里安
答案 2 :(得分:0)
所以......这是我的最终工作代码
模特:
命名空间MyLabs1.Models
{
public class ProductApi
{
[Key]
public Int32 ProductID { get; set; }
public string ProductName { get; set; }
}
}
Controller / ProductController.cs:
public IEnumerable<ProductApi> getall()
{
Mapper.CreateMap<Product, ProductApi>();
var entities = db.Products.OrderBy(x => x.ProductID).ToList();
var models = Mapper.Map<ProductApi[]>(entities);
return models;
}
或强>
public List<ProductApi> GetAll()
{
var products = db.Products
.OrderBy(x => x.ProductID)
.Select(x => new ProductApi
{
ProductID = x.ProductID,
ProductName = x.ProductName
}).ToList();
return products;
}
查看/ ViewProduct.aspx:
function getProducts() { $.getJSON("/api/product", function (data) { $.each(data, function (key, val) { var row = '<tr> <td>' + val.ProductName + '</td><td>' + val.ProductID + '</td><tr/>'; $(row).appendTo($('#tblproduct')); }); }); }
希望这会对他人有所帮助
此致
安德里安