Domanda

Background: 3-4 settimane di esperienza in Silverlight3 / C # /. Net e vale 3 giorni circa con il concetto di Servizi RIA. (la maggior parte delle mie precedenti domande dovrebbe spiegare perché)

Sto eseguendo un'implementazione di prova dei servizi RIA di Microsoft con Silverlight3. Questo fa parte di una prova di concetto che devo fare per un cliente. Quindi è molto semplice. Ho capito come costruire il progetto Silverlight3 usando i servizi RIA ecc. Quindi passare e restituire stringhe e int non è un problema al momento.

Ma devo restituire un ArrayList dalla mia classe di servizio di dominio al mio client SL3. Ma sembra che non sia permesso restituire una ArrayList così com'è. E la mia conoscenza limitata di C # non aiuta a fare casting / conversioni di tipo rapido / ecc. Questa funzione lato server ottiene un ArrayList che deve essere restituito al client SL3, quindi devo fare qualcosa per inviarlo sul lato client.

Domanda: Qualcuno sa cosa dovrebbe essere fatto a un ArrayList (in c #) per consentire a una funzione di classe DomainService di restituirla a una funzione client / SL3 chiamante?

[ NOTA: la maggior parte dei miei tentativi termina con l'errore: " Operazione di servizio denominata "myFunctionName" non conforme alla firma richiesta. Entrambi i tipi di ritorno e parametro devono essere un tipo di entità o uno dei tipi serializzabili predefiniti. & Quot;]

Non esitate a richiedere qualsiasi informazione riteniate appropriata. Grazie in anticipo.

È stato utile?

Soluzione

Mi scuso per non aver pubblicato la soluzione che ho trovato. I capi mi hanno lanciato più lavoro di quanto potessi gestire. :) Si prega di notare che la mia soluzione potrebbe non essere la migliore, ma poiché le mie conoscenze sui servizi SL e RIA sono così nuove, immagino che possa essere scusato. Inizialmente volevo restituire array piuttosto complicati dal codice fornito dal nostro cliente, ma i vincoli di sforzo e tempo mi hanno permesso di ottenere solo il diritto di convertire e restituire un elenco. Spero che questo aiuti in qualche modo.

Lato client: codice Silverlight in MainPage.xaml.cs ho una chiamata per recuperare un elenco di dati dal lato server, da visualizzare in un elenco a discesa.

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

Nella classe del servizio di dominio ho la funzione associata:

    [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

Altri suggerimenti

Non sono sicuro di poter restituire un ArrayList. Immagino che dovresti pensare a restituire un IEnumerable invece che farà riconoscere al servizio il metodo come metodo Read.

Se hai un Elenco o ObservableCollection e desideri associarlo a un ItemControl come ComboBox, puoi impostare la ItemsSource sul ItemControl. Utilizzare la proprietà DisplayPath su ItemControl per impostare la proprietà che si desidera visualizzare o utilizzare un 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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top