.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>");
posted @ 2012-10-11 15:01  濤叔  阅读(2048)  评论(1编辑  收藏  举报