背景:使用RIA服务理念,在Silverlight3 / C#/ .Net中有3-4周的经验,价值约为3天。 (我以前的大部分问题都应该解释原因)
我正在使用Silverlight3测试Microsoft的RIA服务。这是我必须为客户做的概念验证的一部分。所以它非常基础。 我已经弄清楚如何使用RIA服务等构建Silverlight3项目。因此,传递和返回字符串和int是没有问题的。
但是我需要从我的域服务类返回一个ArrayList到我的SL3客户端。但它似乎原样传回一个ArrayList,是不允许的。而我对C#的有限知识无助于快速进行类型转换/转换等。这个服务器端函数得到一个必须返回给SL3客户端的ArrayList,所以我必须用它做一些事情来发送它到客户端。
问题: 有谁知道应该对ArrayList(在c#中)做什么来允许DomainService类函数将它返回给调用客户端/ SL3函数?
[注意:>我的大多数尝试都以错误结束:“名为'myFunctionName'的服务操作不符合所需的签名。返回和参数类型必须是实体类型或一种预定义的可序列化类型。“]
请随时索取您认为合适的任何信息。 提前谢谢。
答案 0 :(得分:2)
我很抱歉没有找到我发现的解决方案。老板们给我的工作比我能处理的要多。 :) 请注意我的解决方案可能不是最好的,但由于我对SL和RIA服务的了解是如此新,我想这可能是可以原谅的。最初我想从客户端提供的代码中传回相当复杂的数组,但努力和时间限制使我只能正确转换并返回List。 希望这在某种程度上有所帮助。
客户端:MainPage.xaml.cs中的Silverlight代码我调用从服务器端检索数据列表,以显示在dropDown列表中。
// Function called on load of the SL interface
// 'slayer' is an object of the Domain Service Class server-side
// 'this.gidSessionNumber' is just a number used in the demo to represent a session
public void loadPaymentTypeComboBox()
{
InvokeOperation<IEnumerable<string>> comboList = sLayer.getPaymentTypeCombo(this.gidSessionNumber);
comboList.Completed += new EventHandler(popPaymentCombo_complete);
}//function loadAllComboBoxes
// Event handler assigned
public void popPaymentCombo_complete(object sender, EventArgs e)
{
InvokeOperation<IEnumerable<string>> obj = (InvokeOperation<IEnumerable<string>>)sender;
string[] list = obj.Value.ToArray();
// 'paymentTypeDropdown' is the name of the specific comboBox in the xaml file
paymentTypeDropdown.IsEnabled = true;
// Assign the returned arrayList as itemSource to the comboBox
paymentTypeDropdown.ItemsSource = list;
}
在域服务类中,我有相关的功能:
[ServiceOperation]
public List<string> getPaymentTypeCombo(string gidNumber)
{
// Build objects from libraries provided by our client
SDT.Life.LifeCO.clsSystemCreator.CreateSysObjects(gidNumber);
this.lobjSys = SDT.Life.LifeCO.clsSystemCreator.GetSysObject(gidNumber);
// Rtrieve the ArrayList from the client's code
clsTextList comboList= this.lobjSys.lstPaymentType_PaymentQueue;
// Get the length of the returned list
int cnt= (int)comboList.Count();
// Create the List<string> which will be populated and returned
List<string> theList= new List<string>();
// Copy each element from the clsTextList to the List<string>
for (int i = 0; i < cnt;i++)
{
string status= comboList.Item(i).Description;
theList.Add(status);
}
// return the newly populated List<string>
return theList;
}//end function getPaymentTypeCombo
答案 1 :(得分:1)
不确定是否可以返回ArrayList。我想你应该考虑返回一个IEnumerable,这将使服务将该方法识别为Read方法。
如果你有一个List或ObservableCollection并希望将它绑定到像ComboBox这样的ItemControl,你可以在ItemControl上设置ItemsSource。使用ItemControl上的DisplayPath属性来设置要显示的属性或使用DataTemplate。
<ComboBox>
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text={"Binding Path=Property1"}/>
<TextBlock Text={"Binding Path=Property2"}/>
<TextBlock Text={"Binding Path=Property3"}/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>