可以将一个类的实例发送到web服务器上的webmethod不是它。 (该类实际上是在Web服务器上创建的。)
我问,因为我有一个填充的类实例,我正在尝试将其发送回网络服务器,但是当实例到达web方法时,它已被清空(已创建一个新的实例)??
可能有助于解释的一些代码:
private void miIssue_Click(object sender, EventArgs e)
{
string r = sC.updatePickItem(batch, deptID, issued, pL);
}
//The creation of the webserver class I want to pass
[Serializable]
public class PickingList
{
List<PickingDetails> pD = new List<PickingDetails>();
public bool found { get; set; }
public PickingDetails[] pickingDetail
{
get { return pD.ToArray(); }
set { }
}
public void addPickingDetail(PickingDetails pI)
{
pD.Add(pI);
}
}
[Serializable]
public class PickingDetails
{
public string warehouse { get; set; }
public string stockCode { get; set; }
}
//The webmethod I'm connecting to
[WebMethod]
public string updatePickItem(string batch, string deptID, bool issued, PickingList pL )
{
try
{
if (!issued)
issued = issueStockToWIP(rows, batch, deptID, pL);
}
catch (Exception e)
{ return e.ToString(); }
}
答案 0 :(得分:3)
如果您使用[WebMethod]
,则通常会在幕后使用XmlSerializer
。看起来最大的问题是set
上的空pickingDetail
。由于XmlSerializer
要求列表/数组上有set
,我可能会保持简单并使用:
[XmlElement("pickingDetail")
public List<PickingDetails> Details {get;set;}
(也许可以在无参数ctor中初始化它以简化使用)
public PickingList() {
Details = new List<PickingDetails>();
}
有关信息,我倾向于在C#中使用.NET命名约定,在xml中使用xml约定 - 例如:
[XmlElement("found")] // or XmlAttribute
public bool Found { get; set; }
对于信息,DataContractSerializer
(默认情况下在WCF服务中使用)对setter没有这种恼人的需求。你也可以切换到WCF ...
答案 1 :(得分:2)
您需要为pickingDetail
提供一个setter,否则如果反序列化该类将如何填充?
尝试
set {
pD.Clear();
foreach (PickingDetails p in value)
addPickingDetail(p);
}