Как вернуть тип ArrayList из класса DomainService на сторону клиента?

StackOverflow https://stackoverflow.com/questions/1614292

Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

Клиентская сторона :Код Silverlight в MainPage.xaml.cs у меня есть вызов для получения списка данных со стороны сервера для отображения в выпадающем списке.

// 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

Другие советы

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

Если у вас есть список или ObservableCollection и вы хотите привязать его к элементу управления, такому как 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top