Rappel sur les applications Silverlight et ASP.NET
C'est l'application Web ASP.NET qui Host l'application Silverlight grâce à la page :ReportingServicesDemoTestPage.aspx
et la ligne :
<param name="source" value="ClientBin/ReportingServicesDemo.xap"/>
Ainsi lorsque vous exécutez l'application dans un navigateur, l'url qui s'affiche est :
http://localhost:52878/ReportingServicesDemoTestPage.aspx#/Home
Et vous obtenez le résultat d'exécution de l'application Silverlight dans la page web Host,
de la façon suivante :
Exécution de l'application Silverlight et Reporting Services dans Chrome |
Silverlight et les Reporting Services - Détails d'une vente |
Silverlight WCF RIA Services - RIA Control Navigation Page
Comment tout ceci fonctionne t-il ? Attardons nous sur la navigation page Silverlight qui affiche la Grid et découvrons cette page. Ernesto Herrera dit qu'il a simplement ajouter une DataGrid dans la page Home du projet : ReportingServicesDemo\Views\Home.xamlEn fait il fait bien plus que cela :
Page Home Silverlight qui utilise le DomainDataSource pour afficher les données dans une DataGrid |
Cette page Silverlight possède une petite icône de BD dans la colonne de gauche.
Il y a deux balises remarquables "riaControls:DomainDataSource" et "my:ADWLTDomainContext" ce sont ces deux balises qui donnent le résultat de la petite icône BD dans la colonne gauche.
En sélectionnant la balise "ADWLTDomainContext" j'obtiens le résultat graphique suivant :
ADWLTDomainContext - DomainDataSource du Services RIA WCF |
Ajout de riaControls dans la page Silverlight
A fin d'ajouter le riaControls vers le DomainContext vous devez ajouter dans la page Home.xaml les deux XML Name Space :
xmlns:riaControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.DomainServices"
xmlns:domain="clr-namespace:ReportingServicesDemo.Web"
Dans le projet, ajoutez une référence à : System.Windows.Controls.DomainServices
Pour cela vous devez avoir installé le SDK : RIA Services
Vérification de l'installation du SDK dans :
C:\Program Files\Microsoft SDKs\RIA Services\v1.0\
Et sinon vous pouvez l'installer Ici.
En suite toujours dans la page Home.xaml, on ajoute le code :
<riaControls:DomainDataSource
AutoLoad="True"
d:DesignData="{d:DesignInstance domain:SalesOrderHeader, CreateList=true}"
Height="0"
LoadedData="salesOrderHeaderDomainDataSource_LoadedData"
Name="salesOrderHeaderDomainDataSource"
QueryName="GetSalesOrderHeaderQuery"
Width="0">
<riaControls:DomainDataSource.DomainContext>
<domain:ADWLTDomainContext />
</riaControls:DomainDataSource.DomainContext>
</riaControls:DomainDataSource>
A la compilation une erreur :
Error 1
The tag 'ADWLTDomainContext' does not exist in XML namespace 'clr-namespace:ReportingServicesDemo.Web'.
Cette erreur semble nous indiquer que le domain services n'a pas été créé dans ReportingServicesDemo.Web. En effet dans l'application de référence on peut constater l'existence de deux fichiers :
Création du WCF RIA Services |
Création de la DataSource du DomainContext
Il s'agit d'une erreur ou bien d'un problème de version mais dans le projet
d'Ernesto Herrera les deux fichiers :
ADWLTDomainService.cs
ADWLTDomainService.metadata.cs
Sont dans le répertoire racine, tandis que si on les déplace dans le répertoire Services et que l'on fait :
Visual Studio - Show Data Sources |
Et pourtant mon application ne fonctionne toujours pas !
Silverlight WCF RIA Services Error NotFound ! |
C'est un piège dans lequel on tombe parfois avec Visual Studio et tout le code généré automatiquement mais les fichiers .datasource ne sont pas le problème. Dans ce cas je préconise de recommencer l'application à zéro.
Je créé une Business Application Silverlight 5.0
J'importe la base AdventureWorksLT2008_Data.mdf dans App_Data
Je recommence mon Modèle Entity, je n'inclus que les tables
Pour changer un peu je vais me passer de la Class Orders.cs et j'attaque directement SalesOrderDetail ma Query Link s'écrit donc :
public IQueryable<SalesOrderDetail> GetOrderDetails(int OrderID)
{
AdventureWorksLT2008_DataEntities adw = new AdventureWorksLT2008_DataEntities();
var query = from c in adw.SalesOrderDetail.Include("Product")
where c.SalesOrderID == OrderID
select new SalesOrderDetail
{
//SalesOrderID = OrderID,
//SalesOrderDetailID = c.SalesOrderDetailID,
//ProducName = c.Product.Name, // BRY
//OrderQty = c.OrderQty,
UnitPrice = c.UnitPrice //,
//UnitPriceDiscount = c.UnitPriceDiscount,
//LineTotal = c.LineTotal
};
return query;
}
Je créé une Business Application Silverlight 5.0
J'importe la base AdventureWorksLT2008_Data.mdf dans App_Data
Je recommence mon Modèle Entity, je n'inclus que les tables
Pour changer un peu je vais me passer de la Class Orders.cs et j'attaque directement SalesOrderDetail ma Query Link s'écrit donc :
public IQueryable<SalesOrderDetail> GetOrderDetails(int OrderID)
{
AdventureWorksLT2008_DataEntities adw = new AdventureWorksLT2008_DataEntities();
var query = from c in adw.SalesOrderDetail.Include("Product")
where c.SalesOrderID == OrderID
select new SalesOrderDetail
{
//SalesOrderID = OrderID,
//SalesOrderDetailID = c.SalesOrderDetailID,
//ProducName = c.Product.Name, // BRY
//OrderQty = c.OrderQty,
UnitPrice = c.UnitPrice //,
//UnitPriceDiscount = c.UnitPriceDiscount,
//LineTotal = c.LineTotal
};
return query;
}
Et l'application tombe en marche mais lorsque je clique sur le bouton me permettant de voir les détails d'un ordre :
Reporting Services - Error to LINQ Entity |
Le DomainContext est généré automatiquement dans :
BusinessApplicationReportingServices\BusinessApplicationReportingServices
\Generated_Code\BusinessApplicationReportingServices.Web.g.cs
Alors je réécris ma query linq, le plus simplement du monde :
public IQueryable<SalesOrderDetail> GetMyOrderDetails(int OrderID)
{
AdventureWorksLT2008_DataEntities adw = new AdventureWorksLT2008_DataEntities();
var query = from c in adw.SalesOrderDetail//.Include("Product")
where c.SalesOrderID == OrderID
select c;
return query;
}
Et le tout tombe en marche :
Silverlight - Reporting Services |
Conclusion
DomaineServices, Reporting Services et Silverlight cela parait tout simple mais les pièges sont nombreux notamment à cause de tout ce code généré il faut souvent rebuilder, mettre à jour les schémas parfois cleaner pour que la solution fonctionne finalement.Finalement :
Je réintègre la class Orders.cs pour effectuer la jointure je réécris le Report Services pour obtenir le résultat suivant :
Exécution de l'application Silverlight WCF RIA - Reporting Services |
Exécution de l'application Silverlight WCF RIA - Reporting Services - Détails d'un ordre de vente |
Download Source Code
Requirements :
Visual Studio 2010 SP1
Reporting Services
WCF Ria Services for Silverlight 5.0
SQL Server EXPRESS 2008
Aucun commentaire:
Enregistrer un commentaire
Pour plus d'interactivité, n'hésitez pas à laisser votre commentaire.