Parameters 动态地将参数从ASPX主机传递到Silverlight 4 xaml代码隐藏
好的,首先,我是Silverlight的新手,我想找人提供指导,看看下面的解决方案是否是解决这个问题的规定方法 昨天我开始研究一个问题,乍一看,这个问题似乎非常简单和直接。我需要将一些参数从承载Silverlight对象标记的ASPX代码隐藏传递到承载Silverlight应用程序中的一个或多个Silverlight用户控件的代码隐藏 所以,在做了一些研究之后,这是我开发的基本解决方案 我发现可以将一个属性添加到名为initParams的对象标记中,可以将一个以逗号分隔的参数名和值列表添加到该属性中。就像这样Parameters 动态地将参数从ASPX主机传递到Silverlight 4 xaml代码隐藏,parameters,silverlight-4.0,asp.net,Parameters,Silverlight 4.0,Asp.net,好的,首先,我是Silverlight的新手,我想找人提供指导,看看下面的解决方案是否是解决这个问题的规定方法 昨天我开始研究一个问题,乍一看,这个问题似乎非常简单和直接。我需要将一些参数从承载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参数基本上是在object标记中硬编码的,没有真正的用处
我做的下一件事是用文本控件替换这个对象标记,并将页面代码中文本控件的文本设置为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();
var sb=new StringBuilder();
某人加上(@“);
某人加上(@“);
某人加上(@“);
某人加上(@“);
某人加上(@“);
某人加上(@“);
某人加上(@“、40);
某人加上(@“);
litObjectTag.Text=sb.ToString();
如果这个初始设计是合理的,那么我的目标是将这个对象标记创建拉入一个服务器控件,该控件将具有DealerId属性,而DealerId属性又将在hosts代码中设置
此时,我让宿主动态地将参数值添加到对象标记的initParams属性中,下一步是获取这些值并在宿主Silverlight应用程序中利用它们
我找到了一些文章来帮助解决这个问题;我正在App.xaml.cs中创建一个公共字典,并在应用程序启动事件中设置它
public IDictionary<string, string> InitConfigDictionary;
private void Application_Startup(object sender, StartupEventArgs e)
{
InitConfigDictionary = e.InitParams;
this.RootVisual = new MainPage();
}
公共IDictionary InitConfigDictionary;
私有void应用程序\u启动(对象发送方、StartupEventArgs e)
{
InitConfigDictionary=e.InitParams;
this.RootVisual=新主页();
}
现在,我可以从任何.xaml用户控件的代码后面访问这个公共字典,如下所示
App App=(App)Application.Current;
var dealerId=app.InitConfigDictionary[“dealerId”]
这个设计很好用,我只是在寻找一些指导,因为我是Silverlight的新手。同样,实现是可行的,但是仅仅为了将一个动态值从主机传递到.xaml文件,似乎需要做大量的工作
因为我是Silverlight的新手,我希望有更多经验的人可以这样说:
a) 帕特里克,你疯了,为什么你要完成所有这些工作,而在Silverlight中,你可以通过使用“xxxxxx”来完成这些工作
b) 是的,帕特里克,这是个累赘,但这种设计基本上是你在Silverlight中必须做的
再次感谢您提供的任何指导。
-PWK我相信你不需要分析整个事情。您可以通过以下方式从aspx页面调用代码隐藏
<param name="initParams" value="<%= BuildInitParams()%>" />
希望这有帮助
Rakibul我相信你不需要分析整个事情。您可以通过以下方式从aspx页面调用代码隐藏
<param name="initParams" value="<%= BuildInitParams()%>" />
希望这有帮助
Rakibul这可能是一个老问题,但我记得有一个类似的问题,我刚刚提出了一个解决方案,至少是为了满足我的需要 首先,我为我的.aspx页面(托管我的Silverlight应用程序)添加了代码隐藏页面。过去,我一直在将键/值对硬编码到initParams字段中,如下所示:
<param id="initParams" runat="server" name="initParams" value="param1=foo,param2=bar" />
在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应用程序加载后,会将其存储在Resources对象中,然后在需要时以代码形式存储,我可以使用以下方法引用它们:
Application.Current.Resources["param1"].ToString();
我对此的特殊用途是服务URL的端点地址。我希望这是我可以在配置文件中更改的内容,允许其他IT人员更新服务地址,而无需重建/重新部署。我可以将其硬编码到ASPX页面的initParams value属性中,但是在那里进行更改既不直观也不容易阅读。我更喜欢配置文件方法。这可能是一个老问题,但我记得有一个类似的问题,我刚刚提出了一个解决方案,至少满足了我的需要 首先,我为我的.aspx页面(托管我的Silverlight应用程序)添加了代码隐藏页面。过去,我一直在将键/值对硬编码到initParams字段中,如下所示:
<param id="initParams" runat="server" name="initParams" value="param1=foo,param2=bar" />
在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应用程序加载后,会将其存储在Resources对象中,然后在需要时以代码形式存储,我可以使用以下方法引用它们:
Application.Current.Resources["param1"].ToString();
我对此的特殊用途是服务URL的端点地址。我希望这是我可以在配置文件中更改的内容,允许其他IT人员更新服务地址,而无需重建/重新部署。我可以将其硬编码到ASPX页面的initParams value属性中,但是在那里进行更改既不直观也不容易阅读。我更喜欢配置文件方法。Rakibul,非常感谢您的回复,但我真的希望从经验丰富的Silverlight开发人员那里得到一些指导。我知道如何完成任务;我只是想知道这个方法是否符合“Silverlight way”-PattrickRakibul,非常感谢您的回复,但我确实在寻找一些指导