具有多个同名变量

时间:2017-02-10 17:14:53

标签: c# asp.net xml

非常新的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请求:

http://imgur.com/3lJQZMs

和回复:

http://imgur.com/a/QNGsm

如果需要控制器查看,请告诉我已排除的任何信息,我将发布。提前谢谢。

1 个答案:

答案 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作为字符串后,您可以通过多种方式解析它。

  1. 使用架构定义来定义一系列与架构匹配的类,然后使用XmlSerializer.Deserialize进行反序列化。

  2. 使用XPath

  3. 提取您需要的数据
  4. 使用Linq-to-Xml

  5. 其中每一个都很复杂,但我会用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);
    }