2010-08-05 6 views
1

Ok, tout d'abord, je suis nouveau à Silverlight et je cherche quelqu'un pour fournir des conseils quant à savoir si la solution suivante est la façon prescrite d'aller à ce sujet.Passer dynamiquement des paramètres de l'hôte ASPX à Silverlight 4 xaml code-behind

Hier, j'ai commencé à travailler sur un problème qui, à première vue, semblait assez simple et direct. Je dois passer quelques paramètres d'un code ASPX derrière, qui héberge une balise d'objet Silverlight, au code d'un ou de plusieurs contrôles utilisateur Silverlight dans l'application Silverlight hébergée.

Ainsi, après avoir fait quelques recherches, c'est la solution de base, j'ai développé ...

J'ai découvert qu'un attribut peut être ajouté à la balise d'objet appelé initParams, une liste délimitée par des virgules des noms et valeurs de paramètres peut être ajouté à cet attribut. Comme si ...

<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%"> 
<param name="source" value="ClientBin/SampleApplication.xap"/> 
<param name="onError" value="onSilverlightError" /> 
<param name="background" value="white" /> 
<param name="minRuntimeVersion" value="3.0.40624.0" /> 
<param name="autoUpgrade" value="true" /> 
<param name="initParams" value='DealerId=17' /> 
</object> 

Cela est bien, sauf que le paramètre DealerId est essentiellement codé en dur dans la balise d'objet, pas réel utile. La prochaine chose que j'ai faite a été de remplacer cette étiquette d'objet par un contrôle littéral, et de mettre le texte du contrôle littéral dans le code-behind de la page à la valeur d'un StringBuilder (où j'ai construit la balise avec l'ajout dynamique de la valeur DealerId correcte). Dans l'exemple suivant, DealerId est codé en dur, mais vous avez l'idée.

var sb = new StringBuilder(); 
      sb.Append(@"<object data=""data:application/x-silverlight-2,"" type=""application/x-silverlight-2"" width=""90%"" height=""80%"">"); 
      sb.Append(@"<param name=""source"" value=""ClientBin/Ascend.SilverlightViewer.xap""/>"); 
      sb.Append(@"<param name=""onError"" value=""onSilverlightError"" />"); 
      sb.Append(@"<param name=""background"" value=""white"" />"); 
      sb.Append(@"<param name=""minRuntimeVersion"" value=""3.0.40624.0"" />"); 
      sb.Append(@"<param name=""autoUpgrade"" value=""true"" />"); 
      sb.Append(@"<param name=""initParams"" value='"); 
      sb.Append(@"ServiceUrl="); 
      sb.AppendFormat("http://{0}{1}", Request.Url.Authority, ResolveUrl("~/ReportService.svc")); 
      sb.Append(@",DebugMode=Full"); 
      sb.AppendFormat(@",DealerId={0}' />", 40); 
      sb.Append(@"</object>"); 

      litObjectTag.Text = sb.ToString(); 

Mon but, si cette conception initiale est sain d'esprit, est alors tirer cette création de balise d'objet dans un contrôle serveur, ce qui aura une propriété DealerId, qui à son tour sera situé dans les hôtes code-behind. À ce stade, l'hôte ajoute dynamiquement des valeurs de paramètre à l'attribut initParams de la balise d'objet, l'étape suivante consiste à obtenir ces valeurs et à les exploiter dans l'application Silverlight hébergée.

J'ai trouvé quelques articles pour vous aider; Je crée un dictionnaire public dans les App.xaml.cs, et le mettre dans l'événement Application_Startup ...

public IDictionary<string, string> InitConfigDictionary; 

private void Application_Startup(object sender, StartupEventArgs e) 
{ 
    InitConfigDictionary = e.InitParams; 
    this.RootVisual = new MainPage(); 
} 

Maintenant, je peux accéder à ce dictionnaire du public à partir du code-behind de tout utilisateur XAML contrôle, comme ceci ...

App app = (App) Application.Current; var dealerId = app.InitConfigDictionary ["DealerId"];

Cette conception fonctionne très bien, je suis juste à la recherche de conseils, étant donné que je suis nouveau à Silverlight. Encore une fois, l'implémentation fonctionne, mais il semble que tout un tas de travail est nécessaire pour transmettre une valeur dynamique de l'hôte aux fichiers .xaml.

Parce que je suis nouveau à Silverlight, j'espère que quelqu'un avec plus d'expérience peut dire que ce soit:

a) Patrick, vous êtes fou, pourquoi allez-vous à travers tout ce travail quand clairement Silverlight vous permettrait d'accomplir cela grâce à l'utilisation de "xxxxxx". B) Ouais, Patrick, c'est un frein, mais cette conception est fondamentalement ce que vous devez faire dans Silverlight.

Encore une fois, tout conseil qui pourrait être fourni serait très apprécié, merci. - PWK

Répondre

1

Vous n'avez pas besoin d'analyser tout ce que je crois. Vous pouvez appeler le code sous-jacent de manière suivante de la page ASPX

<param name="initParams" value="<%= BuildInitParams()%>" /> 

Et dans votre code ont derrière

public string BuildInitParams() 
    { 
     //Dynamically build the string here; 
    } 

espérons que cette aide.

Rakibul

+0

Rakibul, Merci beaucoup pour la réponse, mais je cherchais vraiment des conseils de développeurs Silverlight expérimentés. Je comprends comment accomplir la tâche; Je me demande simplement si la méthodologie est en ligne avec la 'Silverlight-way' - Pattrick –

0

Cela peut être un peu d'une vieille question, mais je me souviens d'avoir un problème similaire et je suis juste venu avec une résolution de toutes sortes, au moins pour mes besoins. D'abord, j'ai ajouté du code derrière la page pour ma page .aspx (hébergeant mon application Silverlight). Dans le passé, j'avais été coder en dur mes paires clé/valeur dans le champ initParams, comme ceci:

<param id="initParams" runat="server" name="initParams" value="param1=foo,param2=bar" /> 

Je voulais une solution où je pouvais stocker ces valeurs dans un fichier de configuration, cependant. J'ai donc ajouté une section à mon fichier de configuration avec les valeurs que je voulais. Je débarrassées l'attribut de valeur dans la balise PARAM sur la page ASPX, et au lieu que je tire dynamiquement des éléments de la et les mettre dans l'attribut de valeur dynamique au moment de l'exécution, en utilisant le Page_Load dans la page ASPX:

protected void Page_Load(object sender, EventArgs e) 
     { 
      initParams.Attributes["value"] += "userId=" + Page.User.Identity.Name; 
      foreach (var key in ConfigurationManager.AppSettings.AllKeys) 
      { 
       initParams.Attributes["value"] += "," + key + "=" + ConfigurationManager.AppSettings[key]; 
      } 
     } 

A partir de là, dans la page App.xaml.cs de l'application Silverlight, j'ai ajouté ce code:

private void Application_Startup(object sender, StartupEventArgs e) 
     { 
      this.RootVisual = new MainPage(); 
      // Take parameters and store them in application resources 
      foreach (var data in e.InitParams) 
      { 
       this.Resources.Add(data.Key, data.Value); 
      } 
     } 

Une fois les charges d'application Silverlight, il stocke ces derniers dans l'objet des ressources, puis dans le code en cas de besoin, je peut se référer à eux en utilisant:

Application.Current.Resources["param1"].ToString(); 

Mon utilisation particulière pour ceci était une adresse de point de terminaison pour une URL de service. Je voulais que ce soit quelque chose que je pourrais changer dans un fichier de configuration, permettant à d'autres informaticiens de mettre à jour l'adresse du service sans que je doive reconstruire/redéployer. J'aurais pu coder en dur ceci dans l'attribut de valeur d'initParams de la page d'ASPX, mais faire des changements là n'est pas intuitif ou facile à lire. Je préfère l'approche du fichier de configuration.