每次请求备份管理页面时,服务端会把所以的备份还原信息都传到客户端,然后ui.tabs将两种信息折叠起来分别显示,好在ui.tabs给我提供ajax功能,我们的每个tab可以直接应用另外一个页面
如:
复制代码 代码如下:
<div id="container">
<ul>
<li><a href="#fragment-1"><span>备份</span></a></li>
<li><a href="Restore.aspx"><span>还原</span></a></li>
</ul>
</div>
但这样,当Restore.aspx存在服务端控件时,当他与服务端交互时,将不会很理想,比如GridView自带排序,分页就不可能实现,因为每一次交互他总是他只会显示你第一次加载该tab的状态(gridview它可能总是显示的第一页),有时甚至会充开整个页面。
解决这个问题,首先想到时ajax以防止被引用的页面全部重新加载。UpdatePanel我试了一下不行,如是便想到juery。
下面我将示范如何结合jquery实现GridView的异步排序,分页。
首先我们还时在页面放放一个gridview,他不会作为页面中真正显示的部分,而是作为辅助html输出,当一个ajax请求来到时,我们利用这个GridView,Render为Html输出,ajax的回调函数完成显示。为了不显示GridView我在PreRender中设置Visible = false,不能直接设置Visible=false否则他不会被Render成html
代码
复制代码 代码如下:
<body onload="getPageData(1)">
<form id="form1" runat="server">
<div >
<div id='ShowData'>
<asp:GridView id="gvRestore" runat="server" Width="100%" PageSize="5" DataSourceID="SqlDataSource1" AutoGenerateColumns="False" AllowPaging="True" OnRowDataBound="gvRestore_RowDataBound" AllowSorting="True" Height="138px" OnDataBound="gvRestore_DataBound" OnPreRender="gvRestore_PreRender" ><Columns>
<asp:BoundField DataField="ID" HeaderText="ID" SortExpression="ID" Visible="False"></asp:BoundField>
<asp:BoundField DataField="WorkId" HeaderText="工号" SortExpression="WorkId"></asp:BoundField>
<asp:BoundField DataField="userName" HeaderText="操作人姓名" SortExpression="userName"></asp:BoundField>
<asp:BoundField DataField="operateType" HeaderText="操作类型" SortExpression="operateType"></asp:BoundField>
<asp:BoundField DataField="operateWay" HeaderText="操作方式" SortExpression="operateWay"></asp:BoundField>
<asp:BoundField DataField="operateTime" HeaderText="操作时间" SortExpression="operateTime"></asp:BoundField>
<asp:BoundField DataField="operatePath" HeaderText="保存路径" SortExpression="operatePath"></asp:BoundField>
<asp:BoundField DataField="operateReason" HeaderText="操作原因" SortExpression="operateReason"></asp:BoundField>
<asp:TemplateField HeaderText="选择">
<ItemTemplate>
<input id="Radio1" type="radio" name="Restore" value='<%#Eval("operatePath") %>'/><label for="Radio1">选择</label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</div>
<asp:SqlDataSource id="SqlDataSource1" runat="server" SelectCommand="SELECT * FROM [BackUpInfo] where operateType='备份'" ConnectionString="<%$ ConnectionStrings:BackUpConnectionString %>">
</asp:SqlDataSource>
</div>
</form>
</body>
注意,我们在Body的onload事件中指定了一个 函数,他会在页面被加载时请求服务端,传回数据。本身是个ajax请求
原形如下:
代码
复制代码 代码如下:
var getPageData=function(i)
{
$.ajax({
url:'Restore.aspx?'+new Date()+'&page='+i,//指定pageindex
type:'get',
success:function(data,textStatus)
{
$('#ShowData')[0].innerHTML=data;
},
error:function(XMLHttpRequest,textStatus)
{
//debugger;
$('#ShowData').text(XMLHttpRequest.responseText);
},
complete:function(XMLHttpRequest,textStatus)
{
}
});
接下来就是排序了,通过get方式指定排序字段,排序方向。函数如下:
代码
复制代码 代码如下:
var sortDataGridView=function(sortExpression,sortDirection)
{
event.returnVaule=false;//阻止提交服务器
$.ajax({
url:'Restore.aspx?'+new Date()+'&sortEx='+sortExpression+'&sortDir='+sortDirection,//IE从在缓存,因此加new Date()防止缓存的影响
type:'get',
success:function(data,textStatus)
{
$('#ShowData')[0].innerHTML=data;
},
error:function(XMLHttpRequest,textStatus)
{
$('#ShowData').text(XMLHttpRequest.responseText);
},
complete:function(XMLHttpRequest,textStatus)
{
}
});
}
当点击GridView中HeadText时我们要触发 sortDataGridView实现异步排序,查看GridView的原始生成内容,实际上是个A标记<a href="javascript:__doPostBack('gvRestore','Sort$WorkId')">
我们要为该标记添加一个onclick事件,并移除href属性值,以防止PostBack服务器。因此我在GridView的RowDataBound事件做如下处理:
代码
复制代码 代码如下:
protected void gvRestore_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.Header)
{
for (int i = 1; i <= 7; i++)
{
LinkButton lt = (LinkButton)e.Row.Cells[i].Controls[0];
lt.Attributes["href"] = "#";
lt.OnClientClick = string.Format(" return sortDataGridView('{0}','{1}')", lt.CommandArgument, "ASC");
}
}
if (e.Row.RowType == DataControlRowType.Pager)
{
e.Row.Visible = false;
}
}
到这一步,思路基本上已经清晰,剩下的事,就是在服务端响应ajax请求了,很简单,直接看代码,要注意是调用GridView的RendControl方法,输出html。
现在可以实现gridview的ajax排序和分页 ,总结一下思路其实很简单,但在实现的时还是走了点弯路,主要时原本想同通过code形式手工实例化一个GridView,但最终还是没有实现,因为我添加了一个模板列。在模板列中添加一个intput type='Radio' 我在code时继承ITemplate,但我确不知怎样实现value='<%#Eval("operatePath") %>'的绑定,这里留下一个问题吧,谁知道,请告诉我。
复制代码 代码如下:
<asp:TemplateField HeaderText="选择">
<ItemTemplate>
<input id="Radio1" type="radio" name="Restore" value='<%#Eval("operatePath") %>'/><label for="Radio1">选择</label>
</ItemTemplate>
</asp:TemplateField>
代码
复制代码 代码如下:
static string sortDirection = "ASC";
protected void Page_Load(object sender, EventArgs e)
{
if (hasKeyName("page"))
{
if (!string.IsNullOrEmpty(Request.QueryString["page"].ToString()))
{
this.gvRestore.PageIndex = int.Parse(Request.QueryString["page"].ToString());
ResponseData(this.gvRestore);
}
}
else
if (hasKeyName("sortEx"))
{
string sortEx = Request.QueryString["sortEx"].ToString();
string sortDir = Request.QueryString["sortDir"].ToString();
if (string.Compare(sortDir, sortDirection, true) == 0)
{
this.gvRestore.Sort(sortEx, SortDirection.Ascending);
sortDirection = "DSAC";
}
else
{
this.gvRestore.Sort(sortEx, SortDirection.Descending);
sortDirection = "ASC";
}
ResponseData(this.gvRestore);
}
}
private bool hasKeyName(string key)
{
string[] keys = Request.QueryString.AllKeys;
foreach (string str in keys)
{
if (String.Compare(key, str, true) == 0)
return true;
}
return false;
}
private void ResponseData(GridView gv)
{
gv.DataSourceID = this.SqlDataSource1.ID;
System.Globalization.CultureInfo info = new System.Globalization.CultureInfo("ZH-CN", true);
System.IO.StringWriter sWriter = new System.IO.StringWriter(info);
System.Web.UI.HtmlTextWriter html = new HtmlTextWriter(sWriter);
gv.DataBind();
if (gv != null)
{
gv.RenderControl(html);
}
Response.Write(html.InnerWriter);
Response.Write(GetNav(gv.PageCount));
Response.Flush();
Response.End();
}
public string GetNav(int pagesize)
{
string NavStr = @"<table><tr>";
for (int i = 0; i < pagesize; i++)
{
NavStr = NavStr + @"<td><a href='#' onclick='getPageData(" + (i + 1).ToString() + ")'>" + (i + 1).ToString() + @" | " + @"</a></td>";
}
NavStr = NavStr + @"</tr></table>";
return NavStr;
}
public override void VerifyRenderingInServerForm(Control control)
{
//base.VerifyRenderingInServerForm(control);
}
protected void gvRestore_PreRender(object sender, EventArgs e)
{
this.gvRestore.Visible = false;
}
相关推荐:
ChatGPT模型进化历程:人工智能的智慧革命,ai 喷枪星空
ChatGPT中文版下载,开启智能对话新体验,婚纱ai男
什么是神马排名?让你的网站脱颖而出,轻松占据搜索引擎的C位!,乳山网站优化关键词排名
AI免费生成文章的软件:轻松创作的秘密武器
常用AI工具,高效智能生活
SEO有点:揭秘优化之道,提升网站排名的秘诀,广州抖音seo厂家地址
seo相关知识是什么,seo相关技术 ,ai写作讯飞星火认知大模型
seo矩阵运营中心是什么,seo矩阵运营中心是什么意思啊 ,北京ai特效
ChatGPT,您的银行卡被拒绝了?别慌,这些方法帮您快速解决问题!,ai给那个标声调
seo网页优化什么意思,seo网站优化必知的10个问答,问吧,【解决】百度不知道 ,ai识别点读机
优化分析:提升企业效益的关键策略,山东大网站建设
用AI写文章:效率与创意的完美结合
ChatGPT:人工智能对话新时代的领航者,ai音响华为还是小米好
为什么选择SEO会员服务,让您的网站流量飞速增长,靖边专业网站建设公司
SEO永远,数字营销的核心力量,广州seo搜索栏内容
SEO和品牌营销:如何通过搜索引擎优化打造品牌影响力,建邺seo软件
seo要懂些什么,seo主要做什么的 ,小艾艾AI
求一个AI软件,彻底改变你的工作与生活!
Chat启用后ESX连不上?解决方法一网打尽!,为什么AI续写这么离谱
优方法-高效生活与工作的秘密武器,钻石营销推广方案
SEO埋词技巧,如何提升网站排名?,贵州营销推广方法
GPT-3模型下载:开启智能时代的无限可能,ai走入
ChatGPT页面空白无法登录?如何解决这一困扰?,温州ai字幕生成
Chatget免费网站版无需登录,畅享无限对话体验!,工业 Ai 视觉检测
SEO部:开启数字化营销新纪元的幕后英雄,株洲营销推广是什么公司
SEO关键词利器:如何借助精准关键词提升网站流量与排名,ai绘画客户
SEO提供:如何通过精准的SEO策略提升网站流量与品牌影响力,刷关键词排名立的火星
怎么用AI写文章:高效创作的秘诀
SEO监控:精准把握网站排名与优化成效的利器,湖南seo排名商家名单
SEO外包:提升网站排名与品牌曝光的最佳选择,大创建设网站
seo软件是什么职位,seo用的是什么软件 ,ai感知树
SEO架构:提升网站流量的核心策略,东营南江全平台营销推广
SEO能给企业带来什么价值,seo的影响 ,ai蓝衣美女
OpenAIGPT:开启智能时代的语言革命,ai辣妹动漫
ChatGPT出现报错503?这些解决办法你必须知道!,粉墨ai说唱
SEO动态:2025年SEO趋势与优化技巧解析,十堰外贸网站推广费用
SEO未来:如何在变革中抢占先机,迎接数字营销的新纪元,台州网站建设分析和总结
seo菲律宾是做什么,菲律宾网址排名 ,openl ai
SEO赚钱:如何通过SEO技能在网络上实现财富自由,网站怎么建设推广平台
seo网站通过什么软件,网站seo软件哪个 ,战团ai
seo配置是什么,seo设置是什么 ,ai图标制作教程
怎么用AI写出高质量科普文章?揭秘新时代创作利器!
OpenAI账号申诉怎么办?全方位解析解决方案,ai写作免费公众号下载
什么是seo网站推广,什么是seo网站推广 ,ai酷男人
seo系列什么意思,seo的分类 ,que n ai je
为什么“未备案域名”会成为互联网行业中的重要问题?,江干区seo优化价格
ChatGPT3.5最新版:智能对话新纪元,带你进入AI的未来世界,ai苔藓生长
seo渠道优化是什么,seo渠道推广怎么做 ,ai121333
SEO查:如何用精准的SEO诊断助力网站流量爆发,美团关键词排名怎么补
为什么选择老域名工具?提升网站SEO与品牌影响力的秘密武器,软文与seo文章区别