1

RadioButton がチェックされているかどうかに応じて使用される CustomValidator を含むユーザー コントロールがあります (複数の RadioButton があり、関連するもののみを表示しています)

<asp:RadioButton runat="Server" ID="RadioBetween" GroupName="DateGroup" CssClass="date_group_options_control_radio" />
<asp:TextBox ID="FromDate" runat="server" Columns="8"></asp:TextBox>
<asp:TextBox ID="ToDate" runat="server" Columns="8"></asp:TextBox>

<asp:CustomValidator ID="DateValidator" runat="server" Display="Dynamic" ClientValidationFunction="ValidateDateFields_Client" OnServerValidate="ValidateDateFields"></asp:CustomValidator>

クライアント側とサーバー側の検証コードがいくつかあります (サーバー側のコードはまったく同じことを行うため、簡潔にするためにスキップされます)。

<script type="text/javascript">
function ValidateDateFields_Client(source, args)
{
    if ("<%=EnableValidation%>" == "True")
    {
        var bRadioBetweenSelected = false;

        var oRadio = document.getElementById('<%=RadioBetween.ClientID%>');
        if (oRadio != null && (oRadio.checked == true || oRadio["checked"] == true))
        {
            bRadioBetweenSelected = true;
        }

        if (bRadioBetweenSelected)
        {
            var oFromDate = document.getElementById('<%=FromDate.ClientID%>');
            var oToDate = document.getElementById('<%=ToDate.ClientID%>');

            if (oFromDate != null && oToDate != null)
            {
                var sFromDate = oFromDate.value;
                var sToDate = oToDate.value;

                source.innerHTML = ValidateFromToDate(sFromDate, sToDate, args);

                if (!args.IsValid)
                {
                    return;
                }
            }
            else
            {
                args.IsValid = true;
            }
        }
        else
        {
            args.IsValid = true;
        }
    }
}
</script>

ページには、このコントロールのインスタンスが 2 つあります。クライアント側のバージョンを実行すると、間違ったバージョン (無効になっているコントロールのバージョン) にヒットします。生成された HTML から、両方が正しく指定されていることがわかります。両方が同じ名前を持っている場合、.NET がどのクライアント側関数を呼び出すかをどのように解決するかはわかりません。

<script type="text/javascript">
//<![CDATA[
var ctl00_MCPH1_QueryTextValidator = document.all ? document.all["ctl00_MCPH1_QueryTextValidator"] : document.getElementById("ctl00_MCPH1_QueryTextValidator");
ctl00_MCPH1_QueryTextValidator.controltovalidate = "ctl00_MCPH1_SearchTextBox";
ctl00_MCPH1_QueryTextValidator.focusOnError = "t";
ctl00_MCPH1_QueryTextValidator.display = "Dynamic";
ctl00_MCPH1_QueryTextValidator.evaluationfunction = "CustomValidatorEvaluateIsValid";
ctl00_MCPH1_QueryTextValidator.clientvalidationfunction = "ValidateQueryText_Client";
ctl00_MCPH1_QueryTextValidator.validateemptytext = "true";
var ctl00_MCPH1_DisplayOptionsControl1_DateValidator = document.all ? document.all["ctl00_MCPH1_DisplayOptionsControl1_DateValidator"] : document.getElementById("ctl00_MCPH1_DisplayOptionsControl1_DateValidator");
ctl00_MCPH1_DisplayOptionsControl1_DateValidator.display = "Dynamic";
ctl00_MCPH1_DisplayOptionsControl1_DateValidator.evaluationfunction = "CustomValidatorEvaluateIsValid";
ctl00_MCPH1_DisplayOptionsControl1_DateValidator.clientvalidationfunction = "ValidateDateFields_Client";
var ctl00_MCPH1_PreferencesControl1_PreferencesTabContainer_DisplayOptionsTab_DisplayOptionsControl_DateValidator = document.all ? document.all["ctl00_MCPH1_PreferencesControl1_PreferencesTabContainer_DisplayOptionsTab_DisplayOptionsControl_DateValidator"] : document.getElementById("ctl00_MCPH1_PreferencesControl1_PreferencesTabContainer_DisplayOptionsTab_DisplayOptionsControl_DateValidator");
ctl00_MCPH1_PreferencesControl1_PreferencesTabContainer_DisplayOptionsTab_DisplayOptionsControl_DateValidator.display = "Dynamic";
ctl00_MCPH1_PreferencesControl1_PreferencesTabContainer_DisplayOptionsTab_DisplayOptionsControl_DateValidator.evaluationfunction = "CustomValidatorEvaluateIsValid";
ctl00_MCPH1_PreferencesControl1_PreferencesTabContainer_DisplayOptionsTab_DisplayOptionsControl_DateValidator.clientvalidationfunction = "ValidateDateFields_Client";
//]]>
</script>

それをスコープするために何かを追加する必要がありますか? これを達成するための最良の方法は何ですか?2 番目のコントロールの読み込みを無効にすると、すべて正常に動作します。

4

1 に答える 1

2

クライアント検証関数は、両方のユーザー コントロールに対して同じ名前で生成されます。ページには2 つの 関数がValidateDateFields_Client()あり、もちろんインタープリターはそのうちの 1 つだけを呼び出します。

この問題を回避する 1 つの方法は、一意の関数名を生成することです。

<script type="text/javascript">
function ValidateDateFields_Client_<%=RadioBetween.ClientID%>(source, args)
{
    // ...
}
</script>


<asp:CustomValidator ID="DateValidator" runat="server" Display="Dynamic"
    ClientValidationFunction="ValidateDateFields_Client_"
    OnServerValidate="ValidateDateFields"></asp:CustomValidator>


protected void Page_PreRender(object sender, EventArgs e)
{
    DateValidator.ClientValidationFunction += RadioBetween.ClientID;
}
于 2010-11-23T20:51:43.523 に答える