客户端自定义验证器中的服务器端变量

本文关键字:服务器端 变量 自定义 验证 客户端 | 更新日期: 2023-09-27 18:12:31

我在页面上有一个自定义验证器:

<asp:CustomValidator ID="CustomValidator2" runat="server"  
     ControlToValidate="ddlProposer" ErrorMessage="Please select some values."  
     Display="Dynamic" onservervalidate="CustomValidator2_ServerValidate" 
     ClientValidationFunction="CustomValidator2_ClientValidate">
</asp:CustomValidator>  

它必须是有效的,当一个服务器端列表不是空的(或者:ListCount变量> 0),这个列表可能会在页面加载后改变(通过更新面板上的按钮):

public partial class Pages_Application_Application : System.Web.UI.Page
{
    protected List<IdValue> ProposersList
    {
        get
        {
            if (ViewState["proposersList"] == null)
                ViewState["proposersList"] = new List<IdValue>();
            return ViewState["proposersList"] as List<IdValue>;
        }
        set
        {
            ViewState["proposersList"] = value;
        }
    }
    public int ListCount
    {
        get
        {
            return this.ProposersList.Count;
        }
    }
...

服务器端验证没有问题:

protected void CustomValidator2_ServerValidate(object source, ServerValidateEventArgs args)
{
    args.IsValid = this.ProposersList.Count > 0;
}

问题出在客户端。我一直在尝试这样做:

<script type="text/javascript">
    function CustomValidator2_ClientValidate(source, arguments) {
        var serverVariable = <%= ListCount %>;
        alert(serverVariable);
        arguments.IsValid = serverVariable > 0;
    }
</script>
但是,

仅在第一次页面加载时触发,并且ListCount变量始终为0 (serverVariable也是如此)。

问题是:有没有一种简单的方法使它工作?所以Javascript获得了一些服务器端变量的当前值?

客户端自定义验证器中的服务器端变量

您可以在页面级别使用隐藏变量,并通过在服务器端设置其值并在客户端验证。

 <input type="hidden" id="ListCount" runat="server" value="0" />

public partial class Pages_Application_Application : System.Web.UI.Page
{
protected List<IdValue> ProposersList
{
    get
    {
        if (ViewState["proposersList"] == null)
            ViewState["proposersList"] = new List<IdValue>();
        return ViewState["proposersList"] as List<IdValue>;
    }
    set
    {
        ViewState["proposersList"] = value;
        ListCount=value; 
    }
}
public int ListCount
{
    get
    {
        return this.ProposersList.Count;
    }
}

<script type="text/javascript">
function CustomValidator2_ClientValidate(source, arguments) {
    var count= document.getElementById("ListCount").value;
    alert(count);
    arguments.IsValid = count > 0;
}

您将不得不在纯javascript中完成,并且没有获得服务器端变量的感觉,因为它在客户机验证完成时不会是最新的。

你需要的是传递你的ddl html元素到你的CustomValidator2_ClientValidate函数,并检查它是否包含option html元素,这应该做的伎俩。