Come scrivere in ASP.net un controllo che usa Silverlight solo se è già sul client

di Alessandro Catorcini, in Misc,

L'introduzione di Silverlight ha aperto la porta a design per le UI prima completamente impensabili. Il problema è che non tutti hanno Silverlight, e non tutti vogliono o possono installarla per vedere la tua pagina.

Il problema che dovevo risolvere è "Come si fa a scrivere un controllo in ASP.net che sappia disegnarsi con Silverlight se è installata e abilitata ma che diventi caro vecchio HTML (magari con un po' di AJAX per essere alla moda) se non la trova.

La soluzione è talmente banale da non essere nemmeno divertente.

Tra i vari modi di chiamare Silverlight dentro il browser, il più prosaico è il caro, vecchio Object tag.

Ora, andando a spulciare tra le specifiche dell'HTML, si scopre che se un object tag contiene HTML, questo viene usato nel caso che ci sia un errore nell'istanziare l'oggetto, altrimenti viene ignorato.

Questo vuol dire che se si seguono i seguenti passi:

creare il file XAML o XBAP e aggiungerlo al progetto rinominandolo .slight (per esempio) e assicurarsi che questo file sia compilato come una risorsa dell'assebly del controllo. Questo fa si' che l'applicazione Silverlight sia distribuita insieme ai binari del custom control.

Nel metodo Render(ByVal writer As System.Web.UI.HtmlTextWriter) del controllo polimorfico, aggiungere

With(writer)
.AddAttribute("ID", "SilverlightPlugInID")
.AddAttribute("Data", "data:application/x-silverlight,")
.AddAttribute("Type", "application/x-silverlight")
.AddAttribute("width", "1000px")
.AddAttribute("height", "500px")
.RenderBeginTag("object")
.AddAttribute("name", "source")
.AddAttribute("value", Page.ClientScript.GetWebResourceUrl(Me.GetType(), "NomeDelMioAssembly.NomeDelMioFileXAMLoXBAP.slight"))
.RenderBeginTag("param")
.RenderEndTag() 'param
.AddAttribute("name", "onError")
.AddAttribute("value", "onErrorHandler")
.RenderBeginTag("param")
.RenderEndTag() 'param
.AddAttribute("name", "onResize")
.AddAttribute("value", "onResizeHandler")
.RenderBeginTag("param")
.RenderEndTag() 'param

< Genera qui l'HTML downlevel >

.RenderEndTag() 'object

...

End With

Se si usa Silverlight 1.0, lo script che costituisce l'applicazione Silverlight viene iniettato in uno script block. In questo caso, lo scambio dei dati tra ASP.net e Silverlight può avvenire scrivendo in un tag script gli oggetti JSON che saranno consumati dall'applicazione.

Se si usa Silverlight 2.0, si può scrivere una data island e usare l'HTML bridge.

Questa soluzione funziona con Internet Explorer 7 e 8 beta e con Firefox 2.0 e Safari su Windows.

 

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese