Welcome

首页 / 脚本样式 / ExtJS / ExtJs学习笔记(23)-ScriptTagProxy+XTemplate+WCF跨域取数据

ExtJs学习笔记(23)-ScriptTagProxy+XTemplate+WCF跨域取数据2010-11-16 cnblogs yjmyzzajax应用中跨域一直是一个非常麻烦的问题,目前也有一些解决办法,但要么比较麻烦,要么就不具备通用性,幸好里的ScriptTagProxy提供了跨域读取数据的功能,而且在几大浏览器上都可以正常运行,但在使用过程中要注意几点:

1.服务端返回时,必须按以下格式返回:

stcCallback1001({...})

其中stcCallback1001中的1001是自动生成的,如果是分页提交的话,每再请求一次1001会变成1002,1003...类推

2.ExtJs官方的示例中虽然ScriptTagProxy的例子并不少,但是就是没有XTemplate+ScriptTagProxy跨域读取的单一功能示例,下面给一个XTemplate跨域读取数据的示例

a.服务端WCF的处理

Code
[OperationContract]
[WebInvoke(ResponseFormat = WebMessageFormat.Json, UriTemplate = "GetData3?start={start}&limit={limit}&callback={callback}", Method = "*")]
public Stream GetData3(int start, int limit,string CallBack)
{
System.Threading.Thread.Sleep(1000);//为演示Ajax加载效果,停1秒
List<T_GuestBook> _List = new List<T_GuestBook>();
_List.Add(new T_GuestBook() { F_ID = 1, F_IP = "192.23.37.41", F_Date = DateTime.Now, F_Content = "这是第一条留言", F_Reply = "" });
_List.Add(new T_GuestBook() { F_ID = 2, F_IP = "192.168.0.1", F_Date = DateTime.Now, F_Content = "这是第二条留言", F_Reply = "" });
_List.Add(new T_GuestBook() { F_ID = 3, F_IP = "192.168.0.2", F_Date = DateTime.Now, F_Content = "这是第三条留言", F_Reply = "" });
_List.Add(new T_GuestBook() { F_ID = 4, F_IP = "172.168.235.1", F_Date = DateTime.Now, F_Content = "这是第四条留言", F_Reply = "" });
_List.Add(new T_GuestBook() { F_ID = 5, F_IP = "10.200.30.4", F_Date = DateTime.Now, F_Content = "这是第五条留言", F_Reply = "" });
_List.Add(new T_GuestBook() { F_ID = 6, F_IP = "10.200.30.5", F_Date = DateTime.Now, F_Content = "这是第六条留言", F_Reply = "" });
//以上操作也可以改为利用Linq直接从数据库读取
PageData<List<T_GuestBook>> _PageData = new PageData<List<T_GuestBook>>();
_PageData.RecordCount = _List.Count;
int PageSize = limit;
if (PageSize <= 0) { PageSize = 1; }
if (PageSize > _PageData.RecordCount) { PageSize = _PageData.RecordCount; }
_PageData.PageSize = PageSize;
//计算总页数
if (_PageData.RecordCount % _PageData.PageSize == 0)
{
_PageData.PageCount = (_PageData.RecordCount / _PageData.PageSize);
}
else
{
_PageData.PageCount = (_PageData.RecordCount / _PageData.PageSize) + 1;
}
int PageIndex = (start/limit) + 1;
if (PageIndex <= 0) { PageIndex = 1; }
if (PageIndex > _PageData.PageCount) { PageIndex = _PageData.PageCount; }
_PageData.CurrentPageIndex = PageIndex;
List<T_GuestBook> _List2 = _List.Skip(start).Take(limit).ToList();//取得当前页数据
_PageData.Data = _List2;
string returnStr = CallBack + "(" + JavaScriptConvert.SerializeObject(_PageData) +")";
MemoryStream ms = new MemoryStream();
StreamWriter sw = new StreamWriter(ms);
sw.AutoFlush = true;
sw.Write(returnStr);
ms.Position = 0;
WebOperationContext.Current.OutgoingResponse.ContentType = "text/plain";
return ms;
}