【问题标题】:ASP.NET Web Api CRUD operation in VS 2010 web applicationVS 2010 Web 应用程序中的 ASP.NET Web Api CRUD 操作
【发布时间】:2012-12-19 19:57:40
【问题描述】:

我尝试在 VS 2010 Web 应用程序中进行 ASP.NET Web Api CRUD 操作,但为什么结果没有从源表返回所有整行。

这是我的代码:

Route/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 }
      );

控制器/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>

下面是产品控制器通过'http://localhost:7031/api/product'的结果:

下面是 getProducts() 函数的结果:

请帮帮我。

有什么想法或建议吗?

【问题讨论】:

  • 你能告诉我们服务返回的完整 JSON 对象吗
  • 感谢重播,请您帮我如何生成json对象的返回
  • 尝试在浏览器的开发者工具选项卡中查看响应(Firefox Firebug 或 Chrome 开发者工具)
  • 我听从了你的建议,但在 chrome 控制台开发者工具上没有任何错误或任何响应。

标签: entity-framework jquery asp.net-web-api crud


【解决方案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;
    }
}

【讨论】:

  • 感谢您的回复。我会根据您的建议尝试使用 Fiddler2,我的项目不包含任何 WebApiConfig.cs 文件,但我的路由表在 global.asax 上定义(见上文) ,可以给我一个关于该配置的很好的链接/参考。
  • 嗨..danludwig 感谢您的建议.. AutoMapper.. 解决了我的问题。
【解决方案2】:

经过一番研究,我终于发现(如果我错了,请纠正我): JavaScriptSerializer 无法从关系中序列化整个对象树 实体与其他实体(产品和类别)之间的关系。

所以..我对我的代码做了一些修改,结果和预期的一样


控制器/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'));
                    });
                });

或者……还有比这更好的方法吗,

如果我仍想传递实体对象而不是字符串对象 (List GetAll()...代替GetAll string()....)

问候,

安德里安

【讨论】:

  • 简而言之,是的,有更好的方法。 WebApi 内置了 javascript 序列化,因此您不需要使用 JsonConvert。但是,您不想直接从控制器返回实体。返回 ApiModels(如 MVC 中的 ViewModels)。您可以使用 AutoMapper 使这更容易,但您不必这样做。有关更多信息,请参阅我的更新答案:stackoverflow.com/a/14219166/304832
【解决方案3】:

所以..这是我的最终工作代码

型号:

命名空间 MyLabs1.Models

{
    public class ProductApi
    {
        [Key]
        public Int32 ProductID { get; set; }
        public string ProductName { get; set; }
    }
}

控制器/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'));
                });
            });
   }

希望这对其他人有所帮助

问候,

安德里安

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    相关资源
    最近更新 更多