.net 后台插入脚本后,页面样式改变解决方案
需求:点击“打印”按钮弹出新窗体。
1. 本人不熟悉.net 客户端脚本没有写出来,故退而求其次,使用后台代码实现。
2. Response.Redirect("");重定向不符合新窗口显示要求。PASS;
3. 使用Response.Write(""); 会发现在弹出新窗口后 原页面样式整体改变。PASS;
4. 使用Page.ClientScript.RegisterStartupScript(""); 最终实现需求效果。
aspx页面
<Columns> <asp:BoundField HeaderText="ID" Visible="False" /> <asp:TemplateField HeaderText="序号"> <ItemTemplate><%# this.GridView1.PageIndex * this.GridView1.PageSize + this.GridView1.Rows.Count + 1%> </ItemTemplate> </asp:TemplateField> <asp:BoundField HeaderText="障碍编号" DataField="Field11146" /> <asp:BoundField HeaderText="发生时间" DataField="field14951" /> <asp:BoundField HeaderText="结束时间" DataField="field15072" /> <asp:BoundField HeaderText="系统名称" DataField="Field14995" /> <asp:BoundField HeaderText="障碍概述" DataField="Field11149" /> <asp:BoundField HeaderText="所属路局" DataField="field11166" /> <asp:BoundField HeaderText="障碍原因" DataField="field14957" /> <asp:TemplateField HeaderText="打印"> <ItemTemplate> <asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False" CommandArgument='<%# Bind("ID") %>' onClick="LinkButton1_Click" Text="打印"></asp:LinkButton> </ItemTemplate> <ItemStyle Width="40px" /> </asp:TemplateField>
aspx.cs代码
protected void LinkButton1_Click(object sender, EventArgs e) { string dID = ((LinkButton)sender).CommandArgument.ToString(); //Response.Redirect("HistoryObstacle.aspx?id=" + dID); string addr = "HistoryObstacle.aspx?id=" + dID; //Response.Write("<script language='javascript'>window.open('" + addr + "');</script>"); Page.ClientScript.RegisterStartupScript(this.GetType(), "", "<script language='javascript'>window.open('" + addr + "');</script>"); }
------------------------------------------------------------------
沙场秋点兵:
ClientScript.RegisterStartupScript方法有3个重载:
方法描述
1:RegisterStartupScript(Page, String, String) 向 ScriptManager 控件注册一个启动脚本块并将该脚本块添加到页面中。需要向第三个参数添加<script></script>脚本标签。 第一个参数为页面Page。 第二个脚本函数的名字,随便起。 第三个是<script></script>形式的脚本内容。 2:RegisterStartupScript(Control, Type, String, String, Boolean) 使用 ScriptManager 控件为 UpdatePanel 中的某个控件注册一个启动脚本块,并将该脚本块添加到页面中。 第一个参数为要注册脚本的控件ID,试了一下,只要是本页面的就行。 第二个参数为注册脚本控件类型,是控件还是this的GetType()都可以,typeOf(string)也没问题. 第三个脚本函数的名字,随便起。 第四个是脚本内容。 第五个是标明是否再添加脚本标签,如果第四个参数里包含了<script></script>标签,此处则为false,否则为true。 3:RegisterStartupScript(Page, Type, String, String, Boolean) 为每个异步回发向 ScriptManager 控件注册一个启动脚本块,并将该脚本块添加到页面中。页面如果有用到Ajax需要用到这种。 第一个参数为页面Page。 第二个参数为注册脚本控件类型,是控件还是this的GetType()都可以,typeOf(string)也没问题. 第三个脚本函数的名字,随便起。 第四个是脚本内容。 第五个是标明是否再添加脚本标签,如果第四个参数里包含了<script></script>标签,此处则为false,否则为true。
RegisterStartupScript和RegisterClientScriptBlock的区别:
View Code
Page.Response.Write("<script>var response;</script>"); Page.RegisterStartupScript("RegisterStartupScript","<script>var RegisterStartupScript;</script>"); Page.RegisterClientScriptBlock("RegisterClientScriptBlock","<script>var RegisterClientScriptBlock;</script>"); Response.Write输出后的位置在源文件的第一行. RegisterClientScriptBlock输出后的位置会在<form>的下一行.(在asp.net自带的脚本和一些隐藏域之下). RegisterStartupScript输出后的位置会在</form>的上一行.
综上,如何在后台执行一段前台脚本. 给div 的innerHTML赋值.如下:
View Code
在后台执行一段前台脚本. 给div 的innerHTML赋值 Page.ClientScript.RegisterStartupScript(typeof(string),"", "<script type='text/javascript'> document.getElementByIdx('divImportdata').innerHTML='<img src="http://images.cnblogs.com/disconfirm.gif"'; </script>");