17

可以说我有这个代码。

<asp:TextBox ID="TextBox1" runat="server" />

<asp:CustomValidator ID="CustomValidator1" runat="server"
    ClientValidationFunction="ValidationFunction1"
    ControlToValidate="TextBox1"
    Display="Dynamic" />

还有一个验证函数:

function ValidationFunction1(sender, args)
{
}

而且我想知道,在函数内部,我是否可以让 Control 验证类似的内容:

var v = sender.ControlToValidate;
4

4 回答 4

29

实际上sender.controltovalidate给出了ClientID控制权。所以这似乎是一个解决方案。

function ValidationFunction1(sender, args){
    var v = document.getElementById(sender.controltovalidate);
}

我试过了,它对我有用。请通知它是否有效。

于 2010-09-03T14:12:49.520 回答
1

未验证,仅供参考:

var v = document.getElementById('<%=CustomValidator1.FindControl(CustomValidator1.ControlToValidate).ClientID>%');

当然你可以简单地这样做:

var v = document.getElementById('<%=TextBox1.ClientID%>');

如果您确切知道要验证的内容。当要验证的控件是动态设置的并且您事先不知道它将是哪个控件时,第一种方法很好。

FindControl()可能返回null,因此您也需要对此进行测试以避免异常。

希望这可以帮助。

于 2010-09-03T14:03:47.477 回答
0

对于任何感兴趣的人,这是我对 C# 中的服务器端解决方案的看法,以模仿上述答案:

<asp:TextBox ID="txtStudentComments" runat="server" 
  Rows="8" Width="100%" 
  ToolbarCanCollapse="False" ValidationGroup="vg1" />
<asp:CustomValidator ID="cv1" runat="server" ControlToValidate="txtStudentComments" 
ErrorMessage="THESE COMMENTS DO NOT SEEM RIGHT. PLEASE REVIEW THEM AGAIN!" SetFocusOnError="true" 
Font-Bold="True" Font-Size="Medium" ValidationGroup="vg1" OnServerValidate="cv1_ServerValidate"></asp:CustomValidator>

在服务器上:

//validate of the comment contains some specific words which imply the TET has not reviewed the comments!
    protected void cv1_ServerValidate(object source, ServerValidateEventArgs args)
    {
        CustomValidator cv = (CustomValidator)source;
        GridViewRow gvRow = (GridViewRow)cv.NamingContainer;
        TextBox editor = (TextBox)gvRow.FindControl("txtStudentComments");

        if (editor.Text.ToUpper().Contains("FACILITATOR TO INSERT COMMENTS HERE PLEASE"))
            args.IsValid = false;
        else
            args.IsValid = true;
    }

这两行是它的症结所在。

    CustomValidator cv = (CustomValidator)source;
    GridViewRow gvRow = (GridViewRow)cv.NamingContainer;

在我的情况下, NamingContainer 将是一个 GridViewRow,但它可能是您的整个页面,具体取决于您的程序。无论哪种方式,它都允许我找到我想要的控件,相对于 ControlToValidate 对象,如前所述,它将返回 ClientID。

于 2017-01-19T02:43:03.003 回答
0

这是我能够访问控件以在客户端进行验证的简单解决方案。添加带有您可能需要的选项的常规自定义验证器控件。

<asp:CustomValidator ID="cvalShippingRegionCountries" ErrorMessage="Choose a country" ClientValidationFunction="ClientValMultiSelectCountries" runat="server" Display="Dynamic" SetFocusOnError="true" /> 

然后,在后面的代码中,只需添加一个自定义属性来存储要验证的控件的 clientID。

cvalShippingRegionCountries.Attributes.Add("ControlToValidateClientID", multiselectShippingRegionCountries.ClientID);

现在,在处理验证的函数中,您可以像这样访问值:

function ClientValMultiSelectCountries(sender, args) {

        var multiselect = $find(sender.attributes.controltovalidateclientid.nodeValue);

        if ( #VALIDATION_CHECK_HERE# ) {
            args.IsValid = false;
        }
    }

您将在函数中获得 clientID ;)

于 2021-02-04T00:35:39.753 回答