Parameters 动态地将参数从ASPX主机传递到Silverlight 4 xaml代码隐藏

Parameters 动态地将参数从ASPX主机传递到Silverlight 4 xaml代码隐藏,parameters,silverlight-4.0,asp.net,Parameters,Silverlight 4.0,Asp.net,好的,首先,我是Silverlight的新手,我想找人提供指导,看看下面的解决方案是否是解决这个问题的规定方法 昨天我开始研究一个问题,乍一看,这个问题似乎非常简单和直接。我需要将一些参数从承载Silverlight对象标记的ASPX代码隐藏传递到承载Silverlight应用程序中的一个或多个Silverlight用户控件的代码隐藏 所以,在做了一些研究之后,这是我开发的基本解决方案 我发现可以将一个属性添加到名为initParams的对象标记中,可以将一个以逗号分隔的参数名和值列表添加到该属

好的,首先,我是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,非常感谢您的回复,但我确实在寻找一些指导