2010-08-05 60 views
1

好的,首先,我是Silverlight的新手,並且正在尋找某人爲下面的解決方案是否按照規定的方式進行操作提供指導。將參數從ASPX主機動態傳遞到Silverlight 4 xaml代碼隱藏

昨天我開始研究一個乍一看似乎很簡單直接的問題。我需要將託管Silverlight對象標記的ASPX代碼隱藏的一些參數傳遞給託管Silverlight應用程序中的一個或多個Silverlight用戶控件的代碼隱藏。

所以,做一些研究之後,這是我公司開發的基本解決...

我發現一個屬性可以被添加到該對象的標籤叫initParams在,逗號分隔參數名稱和值的列表可以添加到此屬性。像這樣...

<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> 

這很好,除了DealerId參數基本上是硬編碼在對象標記中,並不真正有用。

接下來我做的是用一個文字控件替換這個對象標籤,並將頁面代碼中的文字控件的文本設置爲一個StringBuilder的值(我在其中建立了完整的對象標籤動態添加正確的DealerId值)。在下面的例子中,DealerId是硬編碼的,但你明白了。

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(); 

我的目標,如果最初的設計是理智的,是再拉這個對象標籤創建到服務器控制,這將有DealerId財產,這反過來將主機內設置代碼隱藏。

此時,我讓主機動態地將參數值添加到對象標記的initParams屬性中,下一步是獲取這些值並在託管的Silverlight應用程序中利用它們。

我發現了一些文章來幫助解決這個問題;我創建了App.xaml.cs內的公共字典,並Application_Startup事件中設置它...

public IDictionary<string, string> InitConfigDictionary; 

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

現在,我可以訪問此公共字典從任何的.xaml用戶的代碼隱藏控制,像這樣...

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

這個設計工作得很好,我只是尋找一些指導,因爲我是Silverlight的新手。這個實現再一次起作用,但似乎只是將一個動態值從主機傳遞給.xaml文件需要很多工作。

因爲我是新來的Silverlight,我希望更有經驗的人可以說是兩種:

一)帕特里克,你瘋了,你爲什麼要通過這些工作會時明確Silverlight你可以通過使用「xxxxxx」來完成。 b)是的,帕特里克,這是一個阻力,但這種設計基本上是你在Silverlight中必須做的。

再次,任何可以提供的指導將非常感謝,謝謝。 - PWK

回答

1

你不需要解析我相信的整個事情。您可以從後面下列方式從

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

aspx頁面並在代碼中調用的代碼背後有

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

希望這會有所幫助。

Rakibul

+0

Rakibul, 非常感謝回覆,但我確實在尋找一些經驗豐富的Silverlight開發人員的指導。我明白如何完成任務;我只是想知道方法是否符合'Silverlight-way' - Pattrick – 2010-08-13 14:17:59

0

這可能有點老問題,但我記得有一個類似的問題,我只是想出了各種各樣的解決,至少對於我的需求。

首先,我在我的.aspx頁面(託管我的Silverlight應用程序)的頁面後面添加了代碼。在過去,我已經硬編碼我的鍵/值對到initParams在現場,像這樣:

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

我想一個解決方案,我可以然而存儲在配置文件中這些值。所以我用我想要的值向我的配置文件添加了一個部分。我清空了在ASPX頁面上的param標籤屬性的值,而是我動態地從拉項目,並把它們放到值屬性在運行時動態使用的Page_Load在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]; 
      } 
     } 

從那裏,Silverlight應用程序的App.xaml.cs頁面中,我加入這個代碼:

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

一旦Silverlight應用程序加載時,它的資源對象存儲這些,然後在代碼需要我的時候可以參考他們使用:

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

我的特別用途是服務URL的端點地址。我希望這是我可以在配置文件中更改的內容,從而允許其他IT人員更新服務地址,而無需重新構建/重新部署。我可以將它硬編碼到ASPX頁面的initParams值屬性中,但在那裏進行更改並不直觀或易於閱讀。我更喜歡配置文件的方法。

相關問題