【问题标题】:How do I Pass a 'user' object from aspx to silverlight 4如何将“用户”对象从 aspx 传递到 silverlight 4
【发布时间】:2011-05-31 09:32:25
【问题描述】:

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

LoggedInUser.Current

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

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

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

谢谢大佬:

在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 参数传递用户信息会将信息作为纯文本公开给查看页面的用户(他们只需查看源代码)。我们最终使用了身份验证域服务并使用与 aspx 相同的用户对象

【问题讨论】:

    标签: asp.net silverlight xaml poco


    【解决方案1】:

    您有 3 个基本选项:

    • 使用 Silverlight 对象插件的 initParams 参数
    • 使用 Silverlight-javascript 桥访问保存在页面的 aspx 部分中的值
    • 使用 WCF(或 asmx)Web 服务调用来获取您需要的信息

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

    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 做事风格)。

    【讨论】:

    • 感谢您的详细回复。我在网上找到了很多使用 initParams 的例子,但我是一个回到中间层的人,帮助做 Silverlight 方面的人。我会试一试。昨晚我发现的一个问题是,即使我获得了 UserId,我也无法查询以从我们的应用程序中获取与此人相关联的角色。我会将每一个谨慎的信息作为参数传递,并在 silverlight 端构建用户对象。
    • 警告:通过 init params 传递用户信息会将信息作为纯文本公开给查看页面的用户(他们只需要查看源代码)。我们最终使用了身份验证域服务并使用与 aspx 相同的用户对象。
    【解决方案2】:

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

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

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

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

    希望对你有帮助

    【讨论】:

    • 这也是一个可行的选择(我忘了在我的列表中包含这个)。就我个人而言,我不使用它,因为它很慢(任何与跨越 javascript 桥或访问 DOM 相关的东西都很慢),而且它很容易被 URL 篡改。传递一两个非关键信息,尽管这可能是最简单的选择。
    • @slugster 我提供了这个,因为他提到他尝试过 initParams 失败。要使用 WCF,他至少需要将 id 用作参数 .. 这样就只剩下 initParams 和我的选项 ... 我认为这会感觉更自然 .. 尽管容易被篡改 :)
    • 谢谢。我对 initParams 的问题是它们只传递了一个字符串,并且用户信息是从我们的应用程序无法访问的不同位置查询的。 @slugster,以您的示例为例,我想我会将每一条信息作为参数传递,然后看看情况如何。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 2012-02-10
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多