2017-02-10 33 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); 
} 
相关问题