Entity framework VS 2010 Web应用程序中的ASP.NET Web Api CRUD操作
我试图在VS 2010 Web应用程序中执行ASP.NET Web Api CRUD操作,但为什么结果不返回源表中的所有整行 这是我的代码: 路线/Globax.asaxEntity framework VS 2010 Web应用程序中的ASP.NET Web Api CRUD操作,entity-framework,jquery,asp.net-web-api,crud,Entity Framework,Jquery,Asp.net Web Api,Crud,我试图在VS 2010 Web应用程序中执行ASP.NET Web Api CRUD操作,但为什么结果不返回源表中的所有整行 这是我的代码: 路线/Globax.asax protected void Application_Start(object sender, EventArgs e) { RouteTable.Routes.MapHttpRoute( name: "DefaultApi", r
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 }
);
控制器/ProductController.cs:
public class ProductController : ApiController
{
NorthwindEntities db = new NorthwindEntities();
public List<Product> GetAll()
{
return db.Products.ToList<Product>();// ;
}
View/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>
以下是产品控制器通过以下方式得出的结果:
下面是getProducts功能的结果:
请帮帮我
有什么想法或建议吗?当您执行$.getJSON/api/product时,…,您不会得到发布时的XML。你回来了
作为第一步,我建议您下载并安装。打开它,并使用Composer选项卡执行GET forhttp://localhost:7031/api/product. 这将显示返回的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;
}
}
如果使用,可以将控制器代码缩短一点:
public class ProductController : ApiController
{
public IEnumerable<ProductApiModel> GetAll()
{
var entities = db.Products.OrderBy(x => x.ProductID);
var models = Mapper.Map<ProductApiModel[]>(entities);
return models;
}
}
在做了一些研究之后,我最终发现,如果我错了,请纠正我: JavaScriptSerializer未能从关系序列化整个对象树 实体和其他实体之间的产品和类别 所以。。我做了对我的代码进行了一些更改,结果与预期一致 控制器/ProductController.cs:
public class ProductController : ApiController
{
NorthwindEntities db = new NorthwindEntities();
public List<Product> GetAll()
{
return db.Products.ToList<Product>();// ;
}
发件人:
View/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>
发件人:
致:
或者。。。还有比这更好的方法吗
如果我仍然要传递实体对象而不是字符串对象
列出所有。。。取而代之的是GetAll字符串
问候,
安德里安。。这是我最后的工作代码 型号: 名称空间mylab1.Models
{
public class ProductApi
{
[Key]
public Int32 ProductID { get; set; }
public string ProductName { get; set; }
}
}
控制器/ProductController.cs:
public class ProductController : ApiController
{
NorthwindEntities db = new NorthwindEntities();
public List<Product> GetAll()
{
return db.Products.ToList<Product>();// ;
}
或
View/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>
希望这对其他人有帮助
问候,
Andrian你能给我们看一下服务返回的完整JSON对象吗谢谢你的重播,你能帮助我如何生成返回的JSON对象吗?试着在浏览器Firefox Firebug或Chrome开发者工具的开发者工具选项卡中查看响应我遵循了你的建议,但chrome控制台开发工具上没有任何错误或响应。感谢您的回复。。我将尝试使用Fiddler2,根据您的建议,我的项目不包含任何WebApiConfig.cs文件,但是我的路由表define on global.asax见上文,可以为我提供有关该配置的良好链接/参考。嗨..danludwig感谢您的建议。。汽车制造商。。解决了我的问题。简言之,是的,有更好的方法。WebApi内置了javascript序列化,因此不需要使用JsonConvert。但是,您不希望直接从控制器返回实体。返回与MVC中的ViewModels类似的ApiModels。您可以使用AutoMapper使这更容易,但您不必这样做。有关更多信息,请参阅我的更新答案:
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;
}
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'));
});
});
}