一.业务需求
用户输入检索条件(会有多个检索页面)
得出检索数据,绘制相关图形
二.技术分析
需要两张页面,第一张页面,是一个检索页面的代表,用户输入检索条件,服务器调用业务逻辑层,处理检索条件,得出检索结果,检索结果保存为DataTable,作为第一个页面的属性AnalysisResult,然后Server.Transfer到新的SL绘图页面,第二个页面获取前一个页面的AnalysisResult,交给Silverlight,然后绘图。
一.业务需求
- 用户输入检索条件(会有多个检索页面)
- 得出检索数据,绘制相关图形
二.技术分析
需要两张页面,第一张页面,是一个检索页面的代表,用户输入检索条件,服务器调用业务逻辑层,处理检索条件,得出检索结果,检索结果保存为DataTable,作为第一个页面的属性AnalysisResult,然后Server.Transfer到新的Silverlight绘图页面,第二个页面获取前一个页面的AnalysisResult,交给Silverlight,然后绘图。
三.具体实现
由于有多个检索页面,所以先写一个接口,让所有检索页面实现该接口。
using System.Data;
![](/Images/OutliningIndicators/None.gif)
namespace WanFangData.Retrieve
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
public interface IRetrievePage
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
DataTable AnalysisResult
{ get; }
}
}
然后新建一个检索页面WebForm1,实现该接口
using System;
using System.Data;
using WanFangData.Retrieve;
using WanFangData.Analyse;
![](/Images/OutliningIndicators/None.gif)
namespace WanFangData.Web
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
public partial class WebForm1 : System.Web.UI.Page,IRetrievePage
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
private DataTable _analysisresult;
![](/Images/OutliningIndicators/InBlock.gif)
protected void Button1_Click(object sender, EventArgs e)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
_analysisresult = gjfx.getGJFX(TextBox1.Text, TextBox2.Text); //调用业务逻辑层
Server.Transfer("WebForm2.aspx");
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
IRetrievePage Members#region IRetrievePage Members
![](/Images/OutliningIndicators/InBlock.gif)
DataTable IRetrievePage.AnalysisResult
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return _analysisresult; }
}
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
}
}
Silverlight绘图页面获取前一个页面的AnalysisResult属性,将其序列化成JSON,在Silverlight的onload事件里,把JSON传入,Silverlight获得JSON字符串后,反序列化成类对象,然后根据类对象的属性值绘图。
WebForm2
<div id="SilverlightControlHost" class="silverlightHost">
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
<script type="text/javascript">![](https://www.cnblogs.com/Images/dot.gif)
var authorArray=<%=JsonString%>;
createSilverlight();
</script>
![](/Images/OutliningIndicators/None.gif)
</div>
using System;
using System.Data;
using WanFangData.Analyse;
using WanFangData.Common;
![](/Images/OutliningIndicators/None.gif)
namespace WanFangData.Web
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
public partial class WebForm2 : System.Web.UI.Page
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
public string JsonString;
protected void Page_Load(object sender, EventArgs e)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (!IsPostBack)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (Context.Handler.ToString() != "ASP.webform2_aspx")
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
IAnalysisPage webform = (IAnalysisPage)Context.Handler;
JsonString = JSONHelper.SerializerDatatable(webform.AnalysisResult);
}
else
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Response.Redirect("Error.aspx");
}
}
}
}
}
在Silverlight Project里面的js文件里,onLoad事件调用GetJSONData方法,传进JSON字符串,即userContext
onLoad:function(sender,userContext,args)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
var cont=sender.Content.PipeLineControl; //这里的PipeLineControl是在Page类的构造函数里注册的
cont.GetJSONData(userContext);
}
再来看看Page.xaml.cs文件
[Scriptable]
public partial class Page : Canvas
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
public Page()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
// 注册可被外部javascript调用的对象。
WebApplication.Current.RegisterScriptableObject("PipeLineControl", this);
this.Loaded += this.Page_Loaded;
}
![](/Images/OutliningIndicators/InBlock.gif)
[Scriptable]
public void GetJSONData(string jsonData)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
JavaScriptSerializer jss = new JavaScriptSerializer();
GroupClass gc = jss.Deserialize<GroupClass>(jsonData);
this.TextBlock1.SetValue(TextBlock.TextProperty, gc.SomeProperty);
}
![](/Images/OutliningIndicators/InBlock.gif)
public void Page_Loaded(object o, EventArgs e)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
InitializeComponent();
}
}
jss反序列化成类GroupClass的一个对象,然后把这个对象的某个属性值赋给TextBlock1的TextProperty
关于SL绘图,下次再说
本文原创,水平有限,大家多多指教哈~~