如何在ClientValidationFunction中获取“controlToValidate”属性?

17

假设我有以下代码。

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

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

还有一个验证函数:

function ValidationFunction1(sender, args)
{
}

我想知道在函数内部是否可以获取控件并验证某些内容,例如:

var v = sender.ControlToValidate;
4个回答

30

实际上,sender.controltovalidate 给出了控件的 ClientID。所以这似乎是个解决方案。

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

我尝试了一下,对我有效。如果有效,请通知我。


2
这很有趣,因为我在IE和Chrome中都尝试过它,在我的.NET 3.5网站中都运行正常。请确保sender.controltovalidate小写,因为我在使用pascalcased ControlToValidate时也遇到了未定义的情况。 - Musa Hafalir
1
是的,我也像你一样尝试了,但还是没有成功。在声明自定义验证器标签时,你设置了哪些属性? - DJPB
解决了!就是这样,可能是之前的代码有问题,但无论如何,这就是解决方案,谢谢。 - DJPB

1

未经验证,仅供参考:

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

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

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

如果你确切知道你所要验证的内容,第一种方法是很好的选择。当需要验证的控件是动态设置的并且你事先不知道它是哪一个时,这种方式就非常适用。

同时,FindControl()有可能会返回null,因此你需要测试一下以避免出现异常情况。

希望这能对你有所帮助。


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;
        }
    }

你会在你的函数里得到客户端ID ;)


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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接