Как вернуть тип ArrayList из класса DomainService в CLient Side? - PullRequest
1 голос
/ 23 октября 2009

Справочная информация: 3-4 недели опыта в Silverlight3 / C # /. Net и о стоимости за 3 дня с концепцией RIA Services. (большинство моих предыдущих вопросов должны объяснить почему)

Я делаю тестовую реализацию служб RIA от Microsoft с Silverlight3. Это часть доказательства концепции, которую я должен сделать для клиента. Так что это очень просто. Я выяснил, как создать проект Silverlight3 с использованием сервисов RIA и т. Д. Так что передача и возврат строк и целых чисел на данный момент не проблема.

Но мне требуется вернуть ArrayList из моего класса обслуживания домена моему клиенту SL3. Но кажется, что возвращать ArrayList как есть, не разрешено. И мои ограниченные знания C # не помогают выполнять быстрое приведение типов / преобразование / и т.д. Эта серверная функция получает ArrayList, который должен быть возвращен клиенту SL3, поэтому мне нужно что-то с ним сделать, чтобы отправить его на клиентскую сторону.

Вопрос: Кто-нибудь знает, что нужно сделать с ArrayList (в c #), чтобы функция класса DomainService могла вернуть его вызывающей функции client / SL3?

[ ПРИМЕЧАНИЕ: все мои попытки заканчиваются ошибкой: «Операция службы с именем« myFunctionName »не соответствует требуемой сигнатуре. Типы возвращаемого значения и параметра должны быть типом сущности или единичным предопределенных сериализуемых типов. "]

Пожалуйста, не стесняйтесь запрашивать любую информацию, которую вы считаете уместной. Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 26 ноября 2009

Мои извинения за то, что я не опубликовал решение, которое нашел. Боссы бросили на меня больше работы, чем я мог справиться. :) Пожалуйста, обратите внимание, что моё решение может быть не самым лучшим, но так как мои знания в сфере SL и RIA настолько новы, я думаю, это может быть оправдано. Первоначально я хотел передать довольно сложные массивы из кода, предоставленного нашим клиентом, но усилия и временные ограничения позволили мне получить только правильное преобразование и возврат списка. Надеюсь, это поможет каким-то образом.

Сторона клиента: код Silverlight в MainPage.xaml.cs У меня есть вызов, чтобы получить список данных со стороны сервера и отобразить их в списке 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 голос
/ 26 октября 2009

Не уверен, что вы можете вернуть ArrayList. Я думаю, вам следует подумать о возврате IEnumerable вместо этого, чтобы служба распознала метод как метод Read.

Если у вас есть List или ObservableCollection и вы хотите связать его с ItemControl, например ComboBox, вы можете установить ItemsSource в ItemControl. Используйте свойство DisplayPath в ItemControl, чтобы установить свойство, которое вы хотите отобразить, или используйте 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>
...