2010-08-05 72 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值属性中,但在那里进行更改并不直观或易于阅读。我更喜欢配置文件的方法。