0

ファンシーボックスにインラインコンテンツとして登録フォームがあり、リンクがマスターページにあるため、すべてのサイトでアクセスできます。

登録フォームには、国用と都市用の2つのドロップダウンリストがあります。ユーザーが国を変更すると、以前に選択した国と同じように都市のドロップダウンリストが更新されます。スクリプトから取得した国や都市のすべてのデータhttps://bdhacker.wordpress.com/tag/all-countries-of-the-world/

問題は、ユーザーがフォームを送信すると、Firefoxのエラーが表示されることです。

Invalid postback or callback argument.  Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page.  For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.ArgumentException: Invalid postback or callback argument.  Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page.  For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.

エラーが指摘しているように、enableeventvalidation=falseを設定する必要があります。問題は、fancyboxがサイト全体にあるため、すべてのページでそれを実行する必要があることです。これは、セキュリティのベストプラクティスではないことを読みました。他のオプションは、例外がスローされるように、すべてのオプションを両方のドロップダウンのclientscriptmanagerに登録することです。これは、200を超える国と10.000の都市があるため面倒です!!!

何かアイデアはありますか?

ここにいくつかのコードがあります

<%@ Master Language="C#" AutoEventWireup="True" CodeBehind="Site.master.cs" Inherits="VozDirecta.SiteMaster" %>
<script type="text/javascript" charset="utf-8">
    $(document).ready(function () {
        $("#RegistroLightbox").fancybox({

        });
    });

</script>

<body id="page1">
<form id="Form1" runat="server">
<asp:ScriptManager ID="ScriptManager" runat="server">
</asp:ScriptManager>
<a class="labelsTipolinks"  id="RegistroLightbox" href="#LightBoxRegistroDiv">Registro</a>

 <div style="display: none">
    <div id="LightBoxRegistroDiv">
        <asp:DropDownList ValidationGroup="grupoValidacionRegistroUsuario" runat="server"
                    ID="drpDownPais" CssClass="textoLightbox" AutoPostBack="false" CausesValidation="false">
                </asp:DropDownList>
         <asp:DropDownList ValidationGroup="grupoValidacionRegistroUsuario" runat="server"
                    ID="drpDownCiudad" CssClass="textoLightbox" AutoPostBack="false" CausesValidation="false">
                </asp:DropDownList>
    </div>
</div>

データベースからデータを取得してドロップダウンリストにバインドするという他のオプションを検討しますが、JavaScriptを使用したいです

4

1 に答える 1

0

最終的に純粋なhtmlselectコントロールを使用し、両方の値を2つのhiddenFieldsに保存しました。これにより、デフォルト値がtrueのenableeventvalidationを保持できます:)

ここにいくつかのコードがあります:

<select CssClass="textoLightbox" id="selectPais" onchange="cambiarCiudad()"></select>
<asp:HiddenField runat="server" ID="hdnPaisSeleccionado" />

<select CssClass="textoLightbox" id="selectCiudad" onchange="guardarCiudad()"></select>
<asp:HiddenField runat="server" ID="hdnCiudadSeleccionada" />


<script language="javascript" type="text/javascript">
$(document).ready(function () {
    ImprimirPais("selectPais");
    var dropPais = document.getElementById("selectPais");
    var dropCiudad = document.getElementById("selectCiudad");
    dropPais.value = "USA";
    print_state('selectCiudad', dropPais.selectedIndex)
    dropCiudad.value = "California";
    document.getElementById("<%=hdnPaisSeleccionado.ClientID%>").value = "USA";
    document.getElementById("<%=hdnCiudadSeleccionada.ClientID%>").value = "California";

});

//Repopula el combo de las ciudades cuando es cambiado el pais.
function cambiarCiudad() {
    var dropPais = document.getElementById("selectPais");
    //Vacia ciudad
    document.getElementById('selectCiudad').options.length = 0;
    //Repopula ciudad de acuerdo al pais
    print_state('selectCiudad', dropPais.selectedIndex);
    //Guarda Pais
    document.getElementById("<%=hdnPaisSeleccionado.ClientID%>").value = dropPais.value;
    //Guarda Ciudad
    guardarCiudad();
}

function guardarCiudad() {
    var dropCiudad = document.getElementById("selectCiudad");
    document.getElementById("<%=hdnCiudadSeleccionada.ClientID%>").value = dropCiudad.value;
}

于 2012-08-15T15:39:09.883 に答える