2017-02-10 32 views
1

對asp.net和web服務非常新穎,所以原諒我。我有一個POST方法將銷售訂單發佈到我的網頁上。我遇到的問題是,銷售訂單有時可能會有一個名爲「Detail」的變量與之關聯。取決於銷售訂單,此變量可能發生1 ... n次。這個變量總是被稱爲「細節」,我無法控制它的改變。所以,我想我的問題是,我如何創建一個名爲Detail的變量,用於我的SalesOrder類,該變量可以重複多次,並且不僅顯示第一個顯示,而是全部顯示。具有多個同名變量的POST方法

嘗試:循環遍歷request.querystrings,結構體Detail的數組,並將Detail聲明爲一個類並使用新聲明。

我using.net框架4.5

這裏是我的salesorder型號:

public struct shipTo 
{ 

public string id; 
public string Line1; 
public int PostalCode; 
public string City; 
public string State; 
public string CountryCode; 

public void getValues(string l, string c, string s, int pc, string cc, string id) 
{ 
    Line1 = l; 
    PostalCode = pc; 
    City = c; 
    State = s; 
    CountryCode = cc; 

} 
} 

public struct Detail 
{ 

public string LineNumber { get; set; } 
public string GradeItem { get; set; } 
public string Quantity { get; set; } 
public string UOM { get; set; } 
public string RequestDate { get; set; } 
public string Status { get; set; } 

} 

namespace USS_EDIv2.Models 
{ 
public class Order 
{ 

     public Int64 SalesOrderNumber { get; set; } 
     public Int64 PurchaseOrderNumber { get; set; } 
     public Int64 BranchPlant { get; set; } 
     public shipTo ShipTo; 
     public Int64 Quantity { get; set; } 
     public string UOM { get; set; } 
     public Detail Detail; 


} 


} 

和正在張貼的XML請求:

http://imgur.com/3lJQZMs

和響應:

http://imgur.com/a/QNGsm

如果控制器有必要查看,請讓我知道我已排除的任何信息,我會發布。先謝謝你。

+1

請將代碼顯示爲代碼,而不是圖片。沒有辦法複製和粘貼該XML來重現該問題。對於這個問題,如[這個問題](http:// stackoverflow。com/questions/11686740/deserializing-xml-which-has-the-same-element-name-but-different-attributes)解決方案只是爲了讓你的「Detail」屬性具有'List '類型。 –

+0

你爲什麼把這些作爲'structs'做的特別原因? – coolboyjules

+0

沒有特別的。正如他們的ShipTo和Detail包含了他們自己的信息,我將它們設置爲結構以避免變量名稱和清潔度的衝突。 –

回答

0

我收集XML作爲HTTP正文的一部分發布。這意味着你應該使用application/x-www-form-urlencoded之外的內容類型,例如text/html。如果是這種情況,那麼您將無法從Request.Form[]中檢索任何值,因爲這是針對特定格式的HTML表單文章。

相反,您需要將整個XML blob視爲一個字符串並自己解析它。控制器聲明應該是這個樣子:

public async Task<HttpResponseMessage> MyAction([FromBody]string XmlAsString) 
{ 
    var xml = ParseXml(XmlAsString); 
    DoSomethingWithObject(xml); 
} 

注意使用FromBodyAttribute的表示該變量應與整個身體的形式來填充。

將XML作爲字符串之後,可以通過多種方式解析它。

  1. 使用模式定義定義一系列的匹配模式的類,然後反序列化使用XmlSerializer.Deserialize

  2. 拉出使用XPath

  3. 使用Linq-to-Xml你需要的數據。

其中每個都是相當複雜的,但我將向您展示一個使用LINQ的快速示例。

public async Task<HttpResponseMessage> MyAction([FromBody]string XmlAsString) 
{ 
    XElement root = XElement.Parse(XmlAsString); 
    IEnumerable detailList = from seg in root.Descendants("Detail") 
          select (string)seg; 
    DoSomethingWithDetails(detailList); 
} 
相關問題