如何将ASP.NET中的xml序列化对象发送到Silverlight

时间:2011-12-29 21:56:55

标签: c# asp.net silverlight

在按钮上单击ASP.NET页面,我需要加载一个silverlight应用程序,将序列化对象从ASP.NET代码隐藏传递到MainPage.xaml.cs。怎么做?

9 个答案:

答案 0 :(得分:4)

为什么不使用WCF?这非常适合发送序列化对象。此外,WCF在IIS上运行良好,因此它适用于ASP。这是一个tutorial,可以帮助您入门。您应该能够清楚地看到如何定义可以从Silverlight调用的简单API。您只需要将对象作为DataContract的一部分。

答案 1 :(得分:2)

答案 2 :(得分:0)

您可以选择一些选项。您可以使用Javascript - silverlight.net on scripting Silverlight从您的网页到达Silverlight对象内部。

另一个选择是让Silverlight对象访问AspNet页面,使用PageMethods来询问它的xml。 (System.Web.Services.WebMethod)加载后。

答案 3 :(得分:0)

一种选择是在应用的<object>标记中配置Silverlight onLoad事件:

<param name="onLoad" value="setInfo" />

然后使用脚本将XML推送到您的应用程序中(从ASP.NET动态地将XML插入到页面中):

<script type="text/javascript">
    function setInfo(sender) {
        var msg = '<yourtag>your info here</yourtag>';
        sender.getHost().content.Page.SetInfo(msg);
    }
</script>

要允许脚本调用您的应用,请按以下方式配置:

public MainPage()
{
    HtmlPage.RegisterScriptableObject("Page", this);
    InitializeComponent();
}

[ScriptableMember]
public void SetInfo(string xml)
{
    // do stuff
}

答案 4 :(得分:0)

在Silverlight onLoad代码中注册<Object>参数:

<object data="data:application/x-silverlight-2," type="application/x-silverlight-2">
 <param name="source" value="ClientBin/MySlApp.xap"/>
 <param name="onError" value="onSilverlightError" />
 <param name="background" value="white" />
 <param name="minRuntimeVersion" value="4.0.50826.0" />
 <param name="autoUpgrade" value="true" />
 <param name="onLoad" value="onSilverlightLoad" />
</object>

并注册<Script>

<script type="text/javascript">
function onSilverlightLoad(sender, args)
{
var mySlControl = sender.getHost();
mySlControl.content.Communicator.MyDeserializer("SerializedObjectString")
}
</script>

在您的Silverlight应用程序中注册“Communicator”对象,因此它就是应用程序本身:

namespace MySilverlightApp
{
        public MySilverlightApp()
        {
            InitializeComponent();
            HtmlPage.RegisterScriptableObject("Communicator", this);
        }
}

并创建用[ScriptableMember]修饰的反序列化函数:

[ScriptableMember]
public void MyDeserializer(string _stringPassedFromHtmlDocument)
{
 //deserialize _stringPassedFromHtmlDocument
}

我上面的一个使用Silverlight webpart的Sharepoint项目工作。然而,序列化对象被渲染为HTML,因此不确定它是否适用于您的Button.Click()要求。但是有一件事你应该沿着这条路走下去:我在尝试XML序列化时遇到了很多问题,发现JSON是更好的选择。

答案 5 :(得分:0)

在MainPage.xaml.cs中,为您需要传递的任何对象类型定义属性getter / setter。

在ASP.NET页面按钮中单击处理程序,将属性设置为序列化对象。

如果您需要在页面生命周期结束后维护序列化对象,只需更改MainPage.xaml.cs中的属性设置器,以便在页面生命周期内保留序列化对象。

希望这有帮助。

皮特

答案 6 :(得分:0)

这里有两条可能的路径:

1)当按下按钮时,页面会回发到服务器,收集一些信息,将其序列化为XML,显示silverlight组件,然后加载序列化的XML。

2)加载页面时,XML数据可用。按下按钮只显示silverlight组件并要求它加载XML数据。

情景1

以下是您需要针对方案1采取的步骤。

1)将silverlight组件添加到页面并将其嵌入到设置为runat server的容器(div,table,无论你喜欢什么)中。请注意,我们还指定了一个onload参数,用于在silverlight对象完成加载时触发特定事件:

<div id="divDiagram" runat="server">
    <object data="data:application/x-silverlight-2," type="application/x-silverlight-2"
        id="objDiagram">
       <param name="onLoad" value="RefreshDiagram" />
    </object>
</div>

2)在代码隐藏中,隐藏此容器直到按下按钮。例如:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!this.IsPostBack)
        {
            divDiagram.Visible = false;
        }
    }

    void Button1_Click(object sender, EventArgs e)
    {
        divDiagram.Visible = true;
    }

3)添加隐藏输入以保存序列化数据:

<input type="hidden" id="txtSerializedData" runat="server" />

4)点击按钮设置此输入的内容:

 txtSerializedData.Value = "some serialized data";

5)修改silverlight组件代码以将控件暴露给javascript:

    public MainPage()
    {
        InitializeComponent();

        System.Windows.Browser.HtmlPage.RegisterScriptableObject("DiagramPage", this);
    }

6)向silverlight控件添加一个方法,可以从javascript调用(这是ScriptableMember属性)来获取可序列化的内容并使用它:

    [System.Windows.Browser.ScriptableMember()]
    public void RefreshDiagram()
    {
        // Fetch the hidden input control from the page
        var serializedElement = System.Windows.Browser.HtmlPage.Document.GetElementById("txtSerializedData");

        // Then fetch its value attribute
        var sSerializedData = serializedElement.GetAttribute("value");

        // Finally, do something with sSerializedData
    }

7)最后,将javascript方法添加到加载silverlight控件时触发的页面:

<script type="text/javascript">

    function GetDiagramPageContent() {
        /// <summary>This method retrieves the diagram page object content</summary>
        // Exceptions are handled by the caller

        var oObject = document.getElementById('objDiagram');

        if (oObject) {
            return oObject.Content;
        } else {
            return null;
        }
    }

function RefreshDiagram() {
    try {
        var oContent = GetDiagramPageContent();
        try {
            // If we don't have content or a diagram page, bail
            if ((oContent == null) || (oContent.DiagramPage == null)) {
                return;
            }
        } catch (ex) {
            return;
        }

         // Now ask the control to refresh the diagram
        oContent.DiagramPage.RefreshDiagram();
    } catch (ex) {
        alert('Javascript Error (RefreshDiagram)\r' + ex.message);
    }
}
</script>

场景2

场景2与场景1非常相似,但有以下更改:

1)不要在silverlight对象中包含onLoad参数。而是从客户端按钮单击调用RefreshDiagram javascript方法。

2)不要在代码隐藏中显示或隐藏包含div。而是使用样式属性来控制可见性:

<div id="divDiagram" runat="server" style="visibility: hidden; visibility: visible">

并在javascript按钮中单击事件:

var oDiv = document.getElementById("divDiagram");
oDiv.style.visibility = "";
oDiv.style.display = "";

3)在页面加载中加载隐藏文本框,而不是在服务器端按钮单击。

答案 7 :(得分:0)

这可能会有所帮助

Passing Objects between ASP.NET ans Silverlight Controls

最好的问候

答案 8 :(得分:0)

你可以使用Mike Talbot所谓的SilverlightSerializer这个东西