如何将“用户”对象从aspx传递给silverlight 4

时间:2010-12-28 01:41:00

标签: asp.net silverlight xaml poco

首先,我们不得不使用处理身份验证和授权的现有Web框架。 Web项目使用表单身份验证并写入加密的cookie。用户信息作为属性暴露给aspx页面:

LoggedInUser.Current

这有几个属性,包括userId和角色列表。

我已经看过使用initParams,但在那里并不是很成功(编辑:我原来不能动态地做)。我创建了一个带有[Key]属性的简单POCO实体,但我至少需要能够将userId从aspx页面传递给嵌入的silverlight。

将动态对象从aspx传递到silverlight 4的最简单方法是什么?

谢谢slugster:

在aspx页面上设置initParams
<param name="initParams" value="<%=InitParam%>"/> 在代码背后:

private void LoadSilverlightParams()
    {
        LoggedInUser user = LoggedInUser.Current;
        InitParam = "UserId=" + user.PersonId.ToString() + ",";
        InitParam += "OrganizationId=" + user.OrganizationId.ToString() + ",";
        InitParam += "RoleList=";
        foreach(string s in user.Roles)
        {
            InitParam += s + "|";
        }
        InitParam.Remove(InitParam.Count() - 1);
    }

(不漂亮,但有效) 然后使用Slugster的示例来使用Silverlight端的值。

警告:通过init params传递用户信息会将信息作为纯文本显示给查看页面的用户(他们只需要查看源代码)。我们最终使用身份验证域服务并使用与aspx相同的用户对象

2 个答案:

答案 0 :(得分:0)

在silverlight应用程序的启动对象的构造函数中,您可以读取托管silverlight应用程序的aspx页面的查询字符串。

因此,您可以通过查询字符串传递id,然后使用该id调用wcf服务,该服务将返回您的POCO或任何可以通过网络序列化的对象。

获取查询字符串的示例如下所示。

string val = System.Windows.Browser.HtmlPage.Document.QueryString["id"];

希望这有帮助

答案 1 :(得分:0)

您有3个基本选项:

  • 使用Silverlight对象插件的initParams参数
  • 使用Silverlight-javascript桥接器访问页面的aspx部分中保存的值
  • 使用WCF(或asmx)webservice调用来获取所需信息

使用initParams,您可以通过逗号分隔的值列表发送,这些值可用作Silverlight控件的StartupEventArgs部分中的键/值集合Application_Startup参数。然后,您可以检查是否存在特定键,然后使用您找到的值重新水化数据对象:

private void Application_Startup(object sender, StartupEventArgs e)
{
    if (e.InitParams != null && e.InitParams.Count > 0)
    {
        foreach (string key in e.InitParams.Keys)
        {
            switch (key.ToLower())
            {
                case "user":
                    MyAppDetails.UserId = int.Parse(e.InitParams["user"]);
                    break;

                case "year":
                    MyAppDetails.SelectedYear = int.Parse(e.InitParams["year"]);
                    break;

                case "userlogonname":
                    MyAppDetails.UserLogonName = e.InitParams["userlogonname"];
                    break;

                case "currentyear":
                    MyAppDetails.CurrentYear = int.Parse(e.InitParams["currentyear"]);
                    break;

                case "debuglevel":
                    MyAppDetails.DebugLevel = (AppDebugLevel)int.Parse(e.InitParams["debuglevel"] ?? "1");
                    break;

                case "uitheme":
                    MyAppDetails.UITheme = e.InitParams["uitheme"];
                    break;

            }
        }

    }

    this.RootVisual = new MainPage();
}

MyAppDetails是全局可访问的(在SL应用程序内)静态对象)。使用此方法,我可以在aspx页面内的运行时动态填充initParams。

让你开始的一些链接是我herehere的一些前答案,以及很久以前我对同一主题的问题的回答here(这个答案更倾向于WCF的做事风格。)