Pregunta

Antecedentes: 3-4 semanas de experiencia en Silverlight3 / C # /. Net y aproximadamente en 3 días con el concepto de Servicios RIA. (la mayoría de mis preguntas anteriores actualizadas deben explicar por qué)

Estoy haciendo una implementación de prueba de los servicios RIA de Microsoft con Silverlight3. Esto es parte de una prueba de concepto que tengo que hacer para un cliente. Así que es muy básico. He descubierto cómo construir el proyecto Silverlight3 utilizando los servicios de RIA, etc. Por lo tanto, pasar y devolver cadenas e int no es un problema en este momento.

Pero debo devolver una ArrayList de mi clase de servicio de dominio a mi cliente SL3. Pero parece que pasar una ArrayList como está, no está permitido. Y mi conocimiento limitado de C # no ayuda a hacer conversiones / conversiones de tipo rápido, etc. Esta función del lado del servidor obtiene un ArrayList que debe devolverse al cliente SL3, por lo que tengo que hacer algo para enviarlo del lado del cliente.

Pregunta: ¿Alguien sabe qué se debe hacer a un ArrayList (en c #) para permitir que una función de clase DomainService lo devuelva a un cliente que llama / función SL3?

[ NOTA: la mayoría de mis intentos terminan con el error: " La operación de servicio llamada 'myFunctionName' no cumple con la firma requerida. Tanto los tipos de retorno como los de parámetros deben ser un tipo de entidad o uno de los tipos serializables predefinidos. & Quot;]

No dude en solicitar cualquier información que considere apropiada. Gracias de antemano.

¿Fue útil?

Solución

Mis disculpas por no publicar la solución que encontré. Los jefes me lanzaron más trabajo del que podía manejar. :) Tenga en cuenta que mi solución puede no ser la mejor, pero como mi conocimiento de los servicios de SL y RIA es tan nuevo, supongo que puede ser justificado. Inicialmente quería devolver matrices bastante complicadas del código proporcionado por nuestro cliente, pero las restricciones de tiempo y esfuerzo me permitieron solo hacer una conversión correcta y devolver una Lista. Espero que esto ayude de alguna manera.

Lado del cliente: Código Silverlight en MainPage.xaml.cs Tengo una llamada para recuperar una lista de datos del lado del servidor, para mostrarlos en una lista desplegable.

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

En la clase de servicio de dominio tengo la función asociada:

    [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

Otros consejos

No estoy seguro de que puedas devolver una ArrayList. Supongo que debería pensar en devolver un IEnumerable en lugar de eso, lo que hará que el servicio reconozca el método como un método de lectura.

Si tiene una Lista u ObservableCollection y desea enlazarlo a un ItemControl como ComboBox, puede configurar ItemsSource en su ItemControl. Use la propiedad DisplayPath en el ItemControl para establecer la propiedad que desea mostrar o usar una 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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top