如何在ASP.NET c#中执行多个ClientScript.RegisterStartupScript?

Vic*_*tor 1 c# asp.net response.write clientscript registerstartupscript

我正在开发一个gridview,你可以用一个按钮下载多个文件.

这是我的gridview:

<asp:GridView ID="grdvHistorialMensajes" runat="server" AllowPaging="True" 
                    AutoGenerateColumns="False" CellPadding="4" AllowSorting="true"
                    EmptyDataText="No Hay Mensajes Enviados" ForeColor="#333333" 
                    GridLines="None" CellSpacing="1" 
                    onpageindexchanging="grdvHistorialMensajes_PageIndexChanging" 
                    onrowcommand="grdvHistorialMensajes_RowCommand" 
                    onsorting="grdvHistorialMensajes_Sorting">
                    <AlternatingRowStyle BackColor="White" ForeColor="#284775" />

                    <Columns>
                        <asp:BoundField DataField="CorreoCliente" HeaderText="Correo Del Cliente" SortExpression="CorreoCliente" />
                        <asp:BoundField DataField="CorreosAdicionales" HeaderText="Correos Adicionales" SortExpression="CorreosAdicionales" />
                        <asp:BoundField DataField="Tema" HeaderText="Tema" SortExpression="Tema" />
                        <asp:BoundField DataField="Mensaje" HeaderText="Mensaje" SortExpression="Mensaje" />

                        <asp:TemplateField HeaderText="Fecha" SortExpression="Fecha">
                            <ItemTemplate>
                                <%# DataBinder.Eval(Container.DataItem, "Fecha", "{0:dd/MM/yyyy}")%>
                            </ItemTemplate>

                            <EditItemTemplate>
                                <asp:TextBox ID="tbxFecha" runat="server" Text='<%#Bind("Fecha","{0:dd/MM/yyyy}") %>' ValidationGroup="gpEdicionAgenda">
                                </asp:TextBox>
                            </EditItemTemplate>
                        </asp:TemplateField>

                        <asp:BoundField DataField="Hora" HeaderText="Hora" SortExpression="Hora" />
                        <asp:BoundField DataField="Archivos" HeaderText="Archivos" SortExpression="Archivos" />

                        <asp:TemplateField>
                            <ItemTemplate>
                                <asp:ImageButton ID="imgBtnDescargarArchivos" runat="server" 
                                    CommandArgument='<%# Eval("IdMensaje")%>' CommandName="Descargar" Height="16px" 
                                    ImageUrl="~/img/activar.png" ToolTip="Descargar" Width="16px" />
                            </ItemTemplate>
                        </asp:TemplateField>

                        <asp:TemplateField>
                            <ItemTemplate>
                                <asp:ImageButton ID="imgBtnVerMas" runat="server" 
                                    CommandArgument='<%# Eval("IdMensaje")%>' CommandName="VerMas" Height="16px" 
                                    ImageUrl="~/img/search.png" ToolTip="Ver Mas" Width="16px" />
                            </ItemTemplate>
                        </asp:TemplateField>
                    </Columns>

                    <EditRowStyle BackColor="#999999" />
                    <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                    <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                    <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
                    <RowStyle BackColor="#F7F6F3" ForeColor="#333333" HorizontalAlign="Center" />
                    <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
                    <SortedAscendingCellStyle BackColor="#E9E7E2" />
                    <SortedAscendingHeaderStyle BackColor="#506C8C" />
                    <SortedDescendingCellStyle BackColor="#FFFDF8" />
                    <SortedDescendingHeaderStyle BackColor="#6F8DAE" />
                </asp:GridView>
Run Code Online (Sandbox Code Playgroud)

每当我点击"Descargar"RowCommand时,我最初使用它:

if (e.CommandName == "Descargar")
            {
                DataTable dt = ConexionBD.GetInstanciaConexionBD().GetArchivosPorMensaje(Convert.ToInt32(e.CommandArgument));

                foreach (DataRow dr in dt.Rows)
                {
                    string strArchivo = dr["Nombre"].ToString();
                    string strExtension = Path.GetExtension(strArchivo).ToLower();
                    Response.Write("<script>window.open('/Archivos/" + strArchivo + "');</script>");
                }
            }
Run Code Online (Sandbox Code Playgroud)

当我点击时,如果该行让我们说1 pdf,1 jpg和1 doc,它会在不同的窗口中打开pdf和jpg,然后下载文档.这正是我想要的.但是,我注意到每当打开一个新页面时(在pdf和jpg的情况下),页面中的所有字体都会被更改.所以我想找到一个解决方案,然后我尝试了这个:

if (e.CommandName == "Descargar")
            {
                DataTable dt = ConexionBD.GetInstanciaConexionBD().GetArchivosPorMensaje(Convert.ToInt32(e.CommandArgument));

                foreach (DataRow dr in dt.Rows)
                {
                    string strArchivo = dr["Nombre"].ToString();
                    string strExtension = Path.GetExtension(strArchivo).ToLower();
                    ClientScript.RegisterStartupScript(this.GetType(), "myFileOpenScript", "<script>window.open('/Archivos/" + strArchivo + "');</script>");
                }
            }
Run Code Online (Sandbox Code Playgroud)

当我打开一个pdf文件时,这次不会改变字体,但是,它只会打开/下载出现在int dt.Rows [0]的第一个文件(dt.Rows [1] on将无法打开).我想可以多次部署Response.Write,但是,ClientScript.RegisterStartupScript可能只能执行一次.

有没有其他方法可以用来不改变页面的字母字体,只需点击一下就能打开多个文件?

或者我怎么能多次执行ClientScript.RegisterStartupScript?

提前致谢

Jai*_*res 9

一些额外的信息信息会有所帮助.您不限于多次使用RegisterStatupScript,但您不得不多次注册相同的类型/组合键(这是一项功能,而非限制).

如果需要注册不同的脚本,请使用唯一的密钥.如果您只是做回发,重新注册启动脚本将/应该工作.

http://msdn.microsoft.com/en-us/library/system.web.ui.clientscriptmanager.aspx

  • 万一它可以帮助任何人 - 当使用多个RegisterStartupScripts时,一定要**用分号**终止javascript.我花了一个小时撕下我的听力,想知道为什么独特的类型/按键组合不起作用.当我添加第二个启动标记时,丢失的分号才变得明显. (8认同)

Bru*_*oLM 8

ClientScript.RegisterStartupScript(this.GetType(),
    "myFileOpenScript",
    "<script>window.open('/Archivos/" + strArchivo + "');</script>");
Run Code Online (Sandbox Code Playgroud)

这里的脚本密钥是myFileOpenScript.

客户端脚本由其密钥及其类型唯一标识.具有相同密钥和类型的脚本被视为重复.只能在页面中注册一个具有给定类型和密钥对的脚本.尝试注册已注册的脚本不会创建脚本的副本. http://msdn.microsoft.com/en-us/library/asz8zsxy.aspx

您可以使用Guid.NewGuid()每次生成不同的密钥.你可能想要使用

RegisterStartupScript(Type, String, String, Boolean)
Run Code Online (Sandbox Code Playgroud)

代替.最后一个参数(布尔值)告诉它script为您创建标记,因此脚本参数只能包含您不需要担心标记的代码.