【问题标题】:Post JSON Array in Asp.Net Web API在 Asp.Net Web API 中发布 JSON 数组
【发布时间】:2016-04-20 07:34:22
【问题描述】:

大家好,我是 ASP.Net Web API 的新手,我想发布 JSON 数组数据任何到达那里的响应。

我的 JSON POST 数组格式是

{
    "User_Id":"admi12n@1234","Key_Code":"3F-47-AB-84-9F-EB-D6-6B-9C-62-CC-85-98-4D-28-6B",
    "ProductDetails": [
        {"Product_Id":"ELT-7035","Price":"999","Quantity":"5"},
        {"Product_Id":"ELT-1254","Price":"1024","Quantity":"3"}
    ]
}

我想回复如下

{
    "User_Id":"admi12n@1234","Key_Code":"3F-47-AB-84-9F-EB-D6-6B-9C-62-CC-85-98-4D-28-6B",
    "OrderID":"Ord-021","Name":"Sabyasachi"
    "ProductDetails": [
        {"Product_Id":"ELT-7035","Price":"999","Quantity":"5"},
        {"Product_Id":"ELT-1254","Price":"1024","Quantity":"3"}
    ]
}

我将OrderID 随机生成,Name 从发布的User_Id 生成。在这里,我想在一个订单中发布多个产品。

我的订单类如下

public class Order
    {
        [Key]
        public long ID { get; set; }
        public string Order_Id { get; set; }
        public string Product_Id { get; set; }
        public long Quantity { get; set; }
        public long Amount { get; set; }
        public string User_Id { get; set; }
        public string Key_Code { get; set; }
        public DateTime Order_Date { get; set; }
        public DateTime Modified_Date { get; set; }
    }

我的产品类如下

public class Product
    {
        [Key]
        public int Id { get; set; }
        public string Product_Code { get; set; }
        public string Product_Name { get; set; }
        public string Product_Category { get; set; }
        public string Product_Description { get; set; }
        public string Quantity { get; set; }
        public string Price { get; set; }
        public string Image { get; set; }
        public DateTime Created_Date { get; set; }
        public DateTime Modified_Date { get; set; }
    }

我无法找到发布订单的最佳方式

public Order Add(Order odrerDetails) //This will not give array of data for products
{
    using (var context = new EcommerceDBContext())
    {            
        odrerDetails.Order_Id = Helper.Random(7); //Generate random orderID from my class
        odrerDetails.Created_Date = DateTime.Now;
        odrerDetails.Modified_Date = DateTime.Now;
        //How to Save other details
        context.objOrderListing.Add(odrerDetails);
        context.SaveChanges();
        return odrerDetails;
    }
}

在 API 控制器中,我的代码如下

public HttpResponseMessage PostOrder([FromBody] Order_Listing orderData)
{
    orderData = repository.Add(orderData);
    var response = Request.CreateResponse<Order_Listing>(HttpStatusCode.Created, orderData);
    string uri = Url.Link("DefaultApi", new { customerID = orderData.ID });
    response.Headers.Location = new Uri(uri);
    return response;
}

请帮助我如何实现这一目标。

【问题讨论】:

    标签: asp.net json asp.net-web-api


    【解决方案1】:

    您的代码有几个问题:

    1. 您的 OrderProduct 类不反映 你的 JSON。
    2. Order 类包含 1:1 的产品详细信息 关系。基于 JSON,我假设您需要 1:n 关系。
    3. JSON 中的属性需要与 在你的类中,否则它们将不会被映射。

    将您的课程更改为以下内容,它应该可以工作。 当然,您也可以更改 JSON 中的属性名称。

    如果您不能或不想更改属性名称,请考虑使用 DTO

    public class Order
    {
        public string User_Id { get; set; }
        public string Key_Code { get; set; }
        public string OrderID { get; set; }
        public string Name { get; set; }
        public List<Product> ProductDetails { get; set; }
        // add the rest of your properties
    }
    
    public class Product
    {
        public string Product_Id { get; set; }
        public string Price { get; set; }
        public string Prd_Qty { get; set; }
        // add the rest of your properties
    }
    

    更新:添加了 Add 方法和 Api 方法的代码

    您的 Add 方法如下所示:

    public Order Add(Order orderWithDetails)
    {
        using (var context = new EcommerceDBContext())
        {            
            orderWithDetails.Order_Id = Helper.Random(7); //Generate random orderID from my class
            orderWithDetails.Created_Date = DateTime.Now;
            orderWithDetails.Modified_Date = DateTime.Now;
            context.objOrderListing.Add(orderWithDetails);
            // Save each Product
            foreach (var detail in orderWithDetails.ProductDetails) 
            {
                //whatever you need to do in your db-context
                context.objOrderDetails.Add(detail); // just an example
            }
            context.SaveChanges();
            return orderWithDetails;
        }
    }
    

    您的 Api 方法的签名看起来有误。 Order_Listing 是什么?这应该是Order,除非它是 DTO,在这种情况下,您需要一种方法来从 Order_Listing 获取 Order

    public HttpResponseMessage PostOrder([FromBody] Order orderData)
    {
        orderData = repository.Add(orderData);
        var response = Request.CreateResponse<Order_Listing>(HttpStatusCode.Created, orderData);
        string uri = Url.Link("DefaultApi", new { customerID = orderData.ID });
        response.Headers.Location = new Uri(uri);
        return response;
    }
    

    补充几点:

    1. 如果确实是 1:n 关系,您可能需要一个属性 Product.OrderId
    2. 除了列表之外,Order 类不应有任何对 Product 的引用。
    3. QuantityPrice 很可能不是 String 而是数值,例如decimal
    4. 如果Order.ID 是您的主键,那么拥有Order.Order_ID 确实令人困惑。考虑将其重命名为 Order.Order_Number

    【讨论】:

    • 我按照您的要求进行了更改,我的公共 Order Add(Order odrerDetails) 方法是什么来保存数据?
    【解决方案2】:
    public class Order
    {
        public string User_Id { get; set; }
        public string Key_Code { get; set; }
        public string OrderID { get; set; }
        public string Name { get; set; }
        public Product[] ProductDetails { get; set; }
     }
    

    【讨论】:

      猜你喜欢
      • 2016-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-30
      • 2017-07-05
      • 1970-01-01
      • 2013-02-08
      相关资源
      最近更新 更多