【问题标题】:Dynamically passing parameters from ASPX host to Silverlight 4 xaml code-behind将参数从 ASPX 主机动态传递到 Silverlight 4 xaml 代码隐藏
【发布时间】:2010-08-05 14:50:14
【问题描述】:

好的,首先,我是 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 参数基本上是硬编码在对象标签中,没有真正的用处。

接下来我用文字控件替换了这个对象标签,并将页面代码隐藏中的文字控件的文本设置为 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 的新手,所以我希望有更多经验的人可以这样说:

a) 帕特里克,你疯了,你为什么要完成所有这些工作,而在 Silverlight 中你显然可以通过使用“xxxxxx”来完成这些工作。

b) 是的,Patrick,这很麻烦,但这种设计基本上是您在 Silverlight 中必须做的。

再次感谢您提供任何可以提供的指导,谢谢。 - 密码

【问题讨论】:

    标签: parameters silverlight-4.0 asp.net


    【解决方案1】:

    你不需要解析我相信的整个事情。您可以从 aspx 页面通过以下方式调用后面的代码

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

    并且在你的代码后面有

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

    希望这会有所帮助。

    拉基布尔

    【讨论】:

    • Rakibul,非常感谢您的回复,但我确实在寻求经验丰富的 Silverlight 开发人员的指导。我了解如何完成任务;我只是想知道该方法是否符合“Silverlight-way” - Pattrick
    【解决方案2】:

    这可能是一个老问题,但我记得有一个类似的问题,我只是想出了一个解决方案,至少满足我的需要。

    首先,我为我的 .aspx 页面(托管我的 Silverlight 应用程序)添加了页面背后的代码。过去,我一直将键/值对硬编码到 initParams 字段中,如下所示:

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

    但是,我想要一个可以将这些值存储在配置文件中的解决方案。所以我在我的配置文件中添加了一个部分,其中包含我想要的值。我清除了 aspx 页面上 param 标记中的 value 属性,而是使用 ASPX 页面中的 Page_Load 动态地从 中提取项目并将它们动态放入 value 属性中:

    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 应用程序加载后,会将它们存储在 Resources 对象中,然后在需要时在代码中引用它们:

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

    我对此的特殊用途是服务 URL 的端点地址。我希望这是我可以在配置文件中更改的内容,允许其他 IT 人员更新服务地址,而无需我重新构建/重新部署。我可以将它硬编码到 ASPX 页面的 initParams 值属性中,但是在那里进行更改并不直观或易于阅读。我更喜欢配置文件的方式。

    【讨论】:

      猜你喜欢
      • 2010-10-21
      • 1970-01-01
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多