2016-04-20 3 views
1

Привет всем Я новичок в ASP.Net Web API, и я хочу опубликовать JSON данные массива, если есть ответ.Опубликовать JSON Array в Asp.Net Web API

My JSON POST формат массив является

{ 
    "User_Id":"[email protected]","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":"[email protected]","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; 
} 

Пожалуйста, помогите мне, как достичь этого.

ответ

2

Есть несколько вопросов, с кодом:

  1. Ваших Order и Product классов не отражает структуру вашего JSON.
  2. Класс Order содержит информацию о продукте в соотношении 1: 1 . На основе JSON я предполагаю, что вы хотите отношения 1: n.
  3. Свойства вашего JSON должны иметь то же имя, что и , в ваших классах или они не будут отображаться.

Измените свои классы на следующие, и они должны работать. Конечно, вы также можете изменить имена свойств в своем JSON.

Если вы не можете или не хотите, чтобы изменить имена свойств, рассмотреть возможность использования DTOs

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 от Order_Listing.

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: п отношения, вы, вероятно, нужно свойство Product.OrderId.
  2. Класс Order не должен иметь ссылки на Product, за исключением списка.
  3. Quantity и Price, скорее всего, не будет String, но числовые значения, например. decimal.
  4. Если Order.ID Ваш основной ключ, тогда Order.Order_ID действительно запутан. Попробуйте переименовать его в Order.Order_Number.
+0

я изменился за вами и что бы мой общественный заказ Добавить метод (Order odrerDetails) для сохранения данных? –

0
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; } 
}