0

カスタムのクライアント側検証を備えたユーザー コントロールがあります。ページにユーザー コントロールがある場合、問題なく動作します。しかし、そのページにポストバック イベント (ドロップダウンから特定のオプションを選択すると、より多くのフィールドが表示される) がある場合、検証が機能しなくなったようです。私の検証は次のとおりです。

protected void Page_Load(object sender, EventArgs e)
{
    Type cstype = this.GetType();

    if (!Page.ClientScript.IsStartupScriptRegistered(cstype, "ValidatorType"))
    {
        String DateValidator;
        DateValidator = "<script type=\"text/javascript\">\n";
        DateValidator += "function ValidateDate(source, args) {\n";
        DateValidator += "   var ddDay = document.getElementById(source.day);\n";
        DateValidator += "   var day = ddDay.selectedIndex;";
        DateValidator += "   var ddMonth = document.getElementById(source.month);\n";
        DateValidator += "   var month = ddMonth.selectedIndex;\n";
        DateValidator += "   var ddYear = document.getElementById(source.year);\n";
        DateValidator += "   var year = ddYear.selectedIndex;\n";
        DateValidator += "   if (day == 0 || month == 0 || year == 0)\n";
        DateValidator += "      args.IsValid = false;\n";
        DateValidator += "   else\n";
        DateValidator += "      args.IsValid = true;\n";
        DateValidator += "   }\n";
        DateValidator += "</script>";
        Page.ClientScript.RegisterStartupScript(cstype, "ValidatorType", DateValidator);
    }
    Page.ClientScript.RegisterExpandoAttribute(reqDueDate.ClientID, "month", ddMonth.ClientID);
    Page.ClientScript.RegisterExpandoAttribute(reqDueDate.ClientID, "day", ddDay.ClientID);
    Page.ClientScript.RegisterExpandoAttribute(reqDueDate.ClientID, "year", ddYear.ClientID);
}

私は困惑しています。何かアドバイス?

編集:

これが私が使用しているユーザーコントロールです。

<asp:DropDownList ID="ddMonth" runat="server" AppendDataBoundItems="true">
   <asp:ListItem Value="">--Month--</asp:ListItem>
</asp:DropDownList>
<asp:DropDownList ID="ddDay" runat="server" AppendDataBoundItems="true">
    <asp:ListItem Value="">--Day--</asp:ListItem>
</asp:DropDownList>
<asp:DropDownList ID="ddYear" runat="server" AppendDataBoundItems="true">
    <asp:ListItem Value="">--Year--</asp:ListItem>
</asp:DropDownList>
<asp:CustomValidator ID="reqDueDate" EnableClientScript="true" ClientValidationFunction="ValidateDate" runat="server" ErrorMessage="Required" CssClass="input-notification error png_bg" Display="Dynamic"></asp:CustomValidator>
4

2 に答える 2

5

結局、私は2つのことをする必要がありました。ユーザーコードに更新パネルを配置し、行を変更します

Page.ClientScript.RegisterExpandoAttribute(reqDueDate.ClientID, "day", ddDay.ClientID);

ScriptManager.RegisterExpandoAttribute(UpdatePanelDDD, reqDueDate.ClientID, "day", ddDay.ClientID, false);

皆様のご協力とhttp://www.aspnetajaxtutorials.com/2010/09/customvalidator-registerexpandoattribut.htmlのガイダンスに感謝いたします。

于 2012-07-05T14:19:28.943 に答える
0

これに似たことができます:

<script type="text/javascript">
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);

var btn = null;

var EndRequestHandler = function(sender, args) {
    btn = document.getElementById('<%= YourButton.ClientID %>');
    btn.onclick = ValidateDate;
};
</script>

または、これをクライアントのフォーム送信イベントに添付できます

編集: endRequestMS Ajax が非同期リクエストUpdatePanel(DOM の更新など) を完了すると、イベントが発生します。詳細はこちら

于 2012-07-04T18:44:17.050 に答える