如何执行在ASP.NET C#多ClientScript.RegisterStartupScript

2019-10-17 06:35发布

我正在开发一个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>

每当我点击“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>");
                }
            }

当我点击,如果该行不得不让我们说1个PDF,JPG 1和1个文档,它在不同的窗口中打开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>");
                }
            }

当我打开PDF文件,字体没有改变这个时候,然而,它只会开/下载时出现INT dt.Rows [0](dt.Rows [1]不会打开)的第一个文件。 我想,一个回复于可多次部署,然而,ClientScript.RegisterStartupScript大概只能执行一次。

有没有我可以使用不改变页面的文字字体,并打开一个单一的点击多个文件的另一种方法?

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

提前致谢

Answer 1:

一些额外的信息将是有益的。 您没有使用RegisterStatupScript不止一次的限制,但你无法注册相同类型/组合键不止一次的限制(这是一种功能,而不是限制)。

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

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



Answer 2:

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

这里的脚本关键是myFileOpenScript

客户端脚本通过它的键和类型确定。 具有相同的键和类型的脚本被视为重复。 只有一个给定类型和密钥对脚本可以与网页进行注册。 试图注册已注册未创建脚本的副本的脚本。 http://msdn.microsoft.com/en-us/library/asz8zsxy.aspx

您可以使用Guid.NewGuid()来生成不同的密钥各一次。 你可能会想使用

RegisterStartupScript(Type, String, String, Boolean)

代替。 最后一个参数(布尔)告诉它来创建script标签给你,所以脚本参数只能包含你的代码不担心标签。



Answer 3:

你说得对,以避免使用Response.Write在这样的事件处理程序:它之前执行Render页面生命周期的阶段,因此在HTML页面的顶部输出。

你可以使用StringBuilder构建脚本中foreach DataRow循环,然后注册一次。



Answer 4:

由于杰米Tores答案缺少一个例子

这是对的

ScriptManager.RegisterStartupScript(Page, GetType(), "setDatePickerStartDate", "javascript:setDatePickerStartDate('" + s_capstoneStartDate + "'); ", true);
ScriptManager.RegisterStartupScript(Page, GetType(), "setDatePickerEndDate", "javascript:setDatePickerEndDate('" + s_capstoneEndDate + "'); ", true);

这是错误的,因为第三个参数是在两个相同的

 ScriptManager.RegisterStartupScript(Page, GetType(), "Javascript", "javascript:setDatePickerStartDate('" + s_StartDate + "'); ", true);
 ScriptManager.RegisterStartupScript(Page, GetType(), "Javascript", "javascript:setDatePickerEndDate('" + s_EndDate + "'); ", true);


Answer 5:

我通常使用这种方法来显示警报,我可以把它叫做每当我需要。

public class BasePage : System.Web.UI.Page {
        public void ShowNotif(string sMessage) {
            ScriptManager.RegisterStartupScript(Page, GetType(), Guid.NewGuid().ToString(), "alert('" + sMessage.Replace("'", "\'") + "'); ", true);
        }
}

这意味着我可以运行JavaScript代码多次。

用法:每天网络表单类,扩展BasePage的是这样的:

public partial class FinanceHostToHost : BasePage{ //Not extend System.Web.UI.Page
....
}

函数调用:

            ShowNotif("Hello");
            ShowNotif("World");
            ShowNotif("Any message");
            ShowNotif("Message again");


文章来源: How to execute multiple ClientScript.RegisterStartupScript in ASP.NET c#?