非常新的asp.net和网络服务,请原谅我。我有一个POST方法,将销售订单发布到我的网页。我遇到的问题是,销售订单有时会有一个名为“Detail”的变量。此变量可能会发生1 ... n次,具体取决于销售订单。此变量始终称为“详细信息”,我无法更改它。所以,我想我的问题是,如何为我的SalesOrder类创建一个名为Detail的变量,该变量可以重复多次并且不仅显示第一个,而且显示全部。
尝试:循环遍历request.querystrings,struct Detail的数组,将Detail声明为类并使用新声明。
我正在使用.NET framework 4.5
这是我的销售订单模型:
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请求:
和回复:
如果需要控制器查看,请告诉我已排除的任何信息,我将发布。提前谢谢。
答案 0 :(得分: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作为字符串后,您可以通过多种方式解析它。
使用架构定义来定义一系列与架构匹配的类,然后使用XmlSerializer.Deserialize进行反序列化。
使用XPath
使用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);
}