2013-03-08 13 views
6

Sono vincolante alla proprietà List<PersonDetails> . Ricevo i dati tramite Servizio WCF Silverlight abilitato. Pertanto la classe PersonDetails è implementata in Web Project. Ogni intestazione del DataGrid cambia come voglio se la classe si trova nel progetto Silverlight. Ma poi non posso usare questa classe nel servizio web. L'unica soluzione è aggiungere la stessa classe in entrambi i progetti. Ma, c'è un altro modo?Proprietà attributo DisplayAttribute non funzionante in Silverlight

La classe sembra che:

[DataContract] 
public class PersonGeneralDetails 
{ 
    // Properties 

    [DataMember] 
    [DisplayAttribute(Name = "Sira")] 
    public int RowNumber { get; set; } 

    [DataMember] 
    [DisplayAttribute(Name = "Seriyasi")] 
    public string SerialNumber { get; set; } 
} 

Sembra attributi non vengono generati nel progetto web. So che posso cambiare il testo dell'intestazione utilizzando eventi DataGrid. Ma voglio farlo funzionare usando gli attributi.

risposta

3

Il problema è il WCF DataContract è un meccanismo interoperabile che può essere utilizzato attraverso linguaggi e piattaforme.

Se si dà un'occhiata ai dati serializzati generati dal DataContractSerializer (o il suo codice in System.Runtime.Serialization.dll, in particolare InternalWriteObjectXyz() metodi) si vedrà che si limita a serializza i valori in un semplice messaggio XML. Nulla relativo a .NET Framework sarà presente, quindi tutti i tipi di attributi, sia personalizzati che generati dal compilatore, verranno eliminati e non verranno nemmeno ricevuti dal client.

Funziona creazione di una copia dei tuoi dati e inviarli dal server al client, i clienti potranno quindi creare una nuova classe con la stessa firma. Nota: una NEW CLASS con la stessa firma, NON SOLO UN NUOVO OGGETTO della classe originale.

Ovviamente ci sono alcuni rimedi per questo. È possibile scrivere il proprio serializzatore (vedere this post on SO per un esempio) o il proprio numero ISerializationSurrogate.

Se è possibile deploy/condividere gli assembly ai vostri clienti di avere una bella soluzione: basta implementare e DataContractSerializer costruirà l'oggetto giusto sui client (esattamente lo stesso che si ha sul server, con tutta la sua attributi). Basta ricordare che:

  • Se gli attributi personalizzati viene da valori di run-time (per esempio a causa della localizzazione), allora essi saranno risolti sul client, non sul server (poiché gli attributi saranno creato sulla client, i loro valori non saranno inclusi nel messaggio XML).
  • Nell'applicazione client è necessario aggiungere un riferimento all'assembly che contiene i tipi.
  • Quando si aggiunge il vostro riferimento del servizio è necessario istruire VS usarli (o si creerà deleghe), nelle impostazioni di riferimento al servizio dialogo selezionare tipi riutilizzo nelle assemblee riferimento (è possibile limitare questo per solo assembly vuoi condividere).
+0

Grazie. Davvero una buona spiegazione. –

+0

Inoltre, ho ancora una domanda. Stavo studiando le soluzioni che mi hai offerto.Mi sono imbattuto aggiungendo classe come collegamento. Significa distribuire/condividere gli assembly? –

+0

@FarhadJabiyev Servizi RIA? Non so se "mantengono" gli attributi o no, fammi sapere se funziona! –

Problemi correlati