在按钮上单击ASP.NET页面,我需要加载一个silverlight应用程序,将序列化对象从ASP.NET代码隐藏传递到MainPage.xaml.cs
。怎么做?
答案 0 :(得分:4)
为什么不使用WCF?这非常适合发送序列化对象。此外,WCF在IIS上运行良好,因此它适用于ASP。这是一个tutorial,可以帮助您入门。您应该能够清楚地看到如何定义可以从Silverlight调用的简单API。您只需要将对象作为DataContract的一部分。
答案 1 :(得分:2)
执行上述任一帮助 - http://www.silverlight.net/archives/videos/using-startup-parameters-with-silverlight或http://forums.silverlight.net/t/183963.aspx/1?
答案 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)
答案 8 :(得分:0)
你可以使用Mike Talbot所谓的SilverlightSerializer这个东西