0

ASP.NET で JavaScript 関数を実行する必要がありますが、修正できないエラーが発生しました...

私はすでに動作する小さな例を試しました...ここにあります...

Aspx ファイル

<title>Untitled Page</title>
<script type="text/javascript" language="javascript">
    function ExecuteConfirm() {
    debugger
        var returnValue = confirm('Do you want to proceed further?');
        if (returnValue) {
            document.getElementById('hdnExecuteAfterConfirm').value = "1";
            document.getElementById('btnClickMe').click();
        }


    }
</script>


<body>
<form id="form1" runat="server">
<asp:Label runat="server" ID="lblMessage">
</asp:Label>

<div>
    <asp:Button ID="btnClickMe" runat="server" Text="Click me" 
        onclick="btnClickMe_Click" />
</div>
<asp:HiddenField runat="server" ID="hdnExecuteAfterConfirm" />
</form>
</body>

CSファイル

protected void btnClickMe_Click(object sender, EventArgs e)
    {
        //Do server side processing before confirmation
        if (hdnExecuteAfterConfirm.Value != "1")
        {
            lblMessage.Text = "You clicked the button";
            ClientScript.RegisterStartupScript(this.Page.GetType(), btnClickMe.ID, "ExecuteConfirm()", true);

        }
        //Do server side processing after confirmation
        else
        {
            //Proceed further with server side processing

            //Reset the value of hidden field
            hdnExecuteAfterConfirm.Value = "";
            //Notify the user that processing is complete.
            ClientScript.RegisterStartupScript(this.Page.GetType(), btnClickMe.ID, "alert('Processing is complete.')", true);
        }
    }

ここでの目標は、ボタンを初めてクリックしたときに確認メッセージを表示することです (if)。確認メッセージで [はい] をクリックすると、ボタンの機能が繰り返されますが、別のことが行われます (else)...

プロジェクトでこの関数を再作成しようとしていますが、エラーが発生しています...

これが私が持っているものです...

プロジェクト全体をコピーしているわけではないことに注意してください。これらは変更が必要な部分にすぎません...

Site.Master

<script type="text/javascript" language="javascript">
        function ConfirmarRegistroFecha(strAdvertencia) {
            debugger
            var returnValue = strAdvertencia;

            if (returnValue) {
                try{
                document.getElementById('hdnExecuteAfterConfirm').value = "1";  
                document.getElementById('btnGuardarEvento').click();
                }

                catch(error){
                    alert(error);
                }
            }
        }
    </script>

Agenda.aspx (多すぎることはわかっていますが、エラーはおそらくこのあたりにあるので、すべてコピーしています。ポイントは、少なくとも、内部に HiddenField とボタンがあることです)

<asp:View ID="ViewOperacionesAgenda2" runat="server">
            <asp:HiddenField runat="server" ID="hdnExecuteAfterConfirm" />
            <br />

            <asp:Panel ID="pnlRegistrarEvento" runat="server" DefaultButton="btnGuardarEvento">
                <table>
                    <tr>
                        <td align="left">
                            Seleccione Vendedor:
                            <br />

                            <asp:DropDownList ID="dpdLstVendedoresAgenda" runat="server" Width="150px">
                            </asp:DropDownList>
                        </td>

                        <td align="left" rowspan="3">
                            Descripcion:
                            <br />

                            <asp:TextBox ID="tbxAlAgendaDescripcion" runat="server" Height="150px" TextMode="MultiLine" ValidationGroup="gpAgendaAlta" Width="150px">
                            </asp:TextBox>
                        </td>

                        <td align="left" rowspan="3">
                            Fecha:
                            <br />

                            <asp:Calendar ID="Calendar1" runat="server" BackColor="White" 
                                BorderColor="#3366CC" BorderWidth="1px" CellPadding="1" 
                                DayNameFormat="Shortest" Font-Names="Verdana" Font-Size="7pt" 
                                ForeColor="#003399" Height="150px" Width="150px">
                                <DayHeaderStyle BackColor="#99CCCC" ForeColor="#336666" Height="1px" />
                                <NextPrevStyle Font-Size="8pt" ForeColor="#CCCCFF" />
                                <OtherMonthDayStyle ForeColor="#999999" />
                                <SelectedDayStyle BackColor="#009999" Font-Bold="True" ForeColor="#CCFF99" />
                                <SelectorStyle BackColor="#99CCCC" ForeColor="#336666" />
                                <TitleStyle BackColor="#003399" BorderColor="#3366CC" BorderWidth="1px" Font-Bold="True" Font-Size="10pt" ForeColor="#CCCCFF" Height="25px" />
                                <TodayDayStyle BackColor="#99CCCC" ForeColor="White" />
                                <WeekendDayStyle BackColor="#CCCCFF" />
                            </asp:Calendar>
                        </td>

                        <td rowspan="3">
                            <table>
                                <tr>
                                    <td align="left">
                                        Hora Inicio:
                                        <br />

                                        <asp:TextBox ID="tbxAlAgendaHoraInicio" runat="server" ValidationGroup="gpAgendaAlta" Width="130px">0:00 am</asp:TextBox>

                                        <br />

                                        <asp:RegularExpressionValidator ID="RegularExpressionValidator3" runat="server" 
                                            ControlToValidate="tbxAlAgendaHoraInicio" 
                                            ErrorMessage="Hora Invalida: use 00:00 pm" 
                                            ValidationExpression="^((0?[1-9]|1[012])(:[0-5]\d)((\ )?[ap](.)?m(.)?))" 
                                            ValidationGroup="vgpRegistrarEvento" Font-Bold="True" ForeColor="Red">
                                        </asp:RegularExpressionValidator>

                                        <br />

                                        <asp:RequiredFieldValidator ID="RequiredFieldValidator8" runat="server" 
                                            ControlToValidate="tbxAlAgendaHoraInicio" ErrorMessage="Campo Requerido" 
                                            ValidationGroup="vgpRegistrarEvento" Font-Bold="True" ForeColor="Red">
                                        </asp:RequiredFieldValidator>
                                    </td>
                                </tr>

                                <tr>
                                    <td align="left">
                                        Hora Final:
                                        <br/>

                                        <asp:TextBox ID="tbxAlAgendaHoraFinal" runat="server" ValidationGroup="gpAgendaAlta" Width="130px">0:00 am</asp:TextBox>

                                        <br />

                                        <asp:RegularExpressionValidator ID="RegularExpressionValidator4" runat="server" 
                                            ControlToValidate="tbxAlAgendaHoraFinal" 
                                            ErrorMessage="Hora Invalida: use 00:00 pm" 
                                            ValidationExpression="^((0?[1-9]|1[012])(:[0-5]\d)((\ )?[ap](.)?m(.)?))" 
                                            ValidationGroup="vgpRegistrarEvento" Font-Bold="True" ForeColor="Red">
                                        </asp:RegularExpressionValidator>

                                        <br />

                                        <asp:RequiredFieldValidator ID="RequiredFieldValidator9" runat="server" 
                                            ControlToValidate="tbxAlAgendaHoraFinal" ErrorMessage="Campo Requerido" 
                                            ValidationGroup="vgpRegistrarEvento" Font-Bold="True" ForeColor="Red">
                                        </asp:RequiredFieldValidator>
                                    </td>
                                </tr>
                            </table>
                        </td>
                    </tr>

                    <tr>
                        <td align="left">
                            Seleccione Cliente:
                            <br />

                            <asp:DropDownList ID="dpdLstClientesAgenda" runat="server" AutoPostBack="True" onselectedindexchanged="dpdLstClientesAgenda_SelectedIndexChanged" Width="150px">
                            </asp:DropDownList>
                        </td>
                    </tr>

                    <tr>
                        <td align="left">
                            Tipo:
                            <br />

                            <asp:DropDownList ID="dpdLstAlAgendaTipo" runat="server" Width="150px">
                                <asp:ListItem>Reunion</asp:ListItem>
                                <asp:ListItem>Entrevista</asp:ListItem>
                                <asp:ListItem>Venta</asp:ListItem>
                                <asp:ListItem>Soporte</asp:ListItem>
                                <asp:ListItem>Instalacion</asp:ListItem>
                            </asp:DropDownList>
                        </td>
                    </tr>
                </table>

                <br />
                <asp:Button ID="btnCancelarEvento" runat="server" CausesValidation="False" onclick="btnCancelarEvento_Click" Text="Cancelar" Width="90px" />
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                <asp:Button ID="btnGuardarEvento" runat="server" onclick="btnGuardarEvento_Click" Text="Guardar" ValidationGroup="vgpRegistrarEvento" Width="90px" />
            </asp:Panel>

Agenda.aspx.cs

protected void btnGuardarEvento_Click(object sender, EventArgs e)
    {

            if (hdnExecuteAfterConfirm.Value != "1")
            {
                strAdvertencia = "MESSAGE I WANT TO DISPLAY";
                ClientScript.RegisterStartupScript(this.Page.GetType(), btnGuardarEvento.ID, "ConfirmarRegistroFecha(" + strAdvertencia + ")", true);

            }

            else
            {
                hdnExecuteAfterConfirm.Value = "";
                //Rest of process
            }
    }

Firebug でデバッガーを使用すると、Site.Master に到達すると、それがはっきりとわかります。

document.getElementById('hdnExecuteAfterConfirm').value = "1";

次の例外が表示されます。

TypeError: document.getElementById("hdnExecuteAfterConfirm") is null

Site.Master の代わりに Agenda.aspx に JavaScript をコピーしようとしましたが、まだ動作しません...

ここの間違いが何か知っている人はいますか...私はjavascriptが初めてなので、それは構文エラーだとまだ信じています...

事前に感謝します。あなたが私を助けてくれることを願っています

4

2 に答える 2

1

次のスクリプトを使用します。

document.getElementById('<%= hdnExecuteAfterConfirm.ClientID %>').value = "1";  
document.getElementById('<%= btnGuardarEvento.ClientID %>').click();

マスター ページを使用しているため、クライアント ID はhdnExecuteAfterConfirmサーバー ID とは異なります。

于 2012-08-04T19:24:05.973 に答える
1

問題は、コントロールがコンテナー コントロールに埋め込まれているため、その ID がクライアントで変更されることです。

Firefox に相当するものはわかりませんが、Internet Explorer (少なくとも v9) では、F12 を押して開発者ツールを開き、DOM 構造をナビゲートして実際の名前を確認できます。

これに対処するには、脆弱なソリューションである完全な ID をハードコーディングするか、提供された ID を使用するように web.config を更新するなど、ID の競合につながる可能性があるさまざまな方法があります。

この問題を解決する方法は、クライアント ID を使用してコード ビハインドで JavaScript 変数を作成することです。そうすれば、コントロールが別のコンテナー コントロールに移動したり、名前が変更されたりした場合でも、これを考慮してコードを調整する必要はありません。

これを行うには、Page.ClientScript.PageClient.RegisterStartupScript を使用します。例えば:

this.ClientScript.RegisterStartupScript(this.GetType(), "LocalVars", "var m_hdnExecuteAfterConfirmId = '" + hdnExecuteAfterConfirm.ClientID + "';" + Environment.NewLine, true);

次に、JavaScript を次のように変更します。

document.getElementById('m_hdnExecuteAfterConfirmId').value = "1";
于 2012-08-04T18:19:26.657 に答える