C# 客户验证程序错误赢得';不显示在验证摘要中

C# 客户验证程序错误赢得';不显示在验证摘要中,c#,asp.net,validation,webforms,C#,Asp.net,Validation,Webforms,我在我的页面中添加了一个CustomValidator,用于验证服务器端的输入。 当验证无效时,验证工作正常并在屏幕上显示错误消息,但如果我将其更改为在validationsummary中显示,页面将设置为isvalid=false,但validationsummary从不显示 我在屏幕上还有其他验证器(RegularExpression,RequiredField),在我更改CustomValidator的查看模式之前,这些验证器工作正常,此时它们也不会显示 我已经尝试了所有现有的线程,包括下

我在我的页面中添加了一个
CustomValidator
,用于验证服务器端的输入。 当验证无效时,验证工作正常并在屏幕上显示错误消息,但如果我将其更改为在
validationsummary
中显示,页面将设置为
isvalid=false
,但
validationsummary
从不显示

我在屏幕上还有其他验证器(
RegularExpression
RequiredField
),在我更改
CustomValidator
的查看模式之前,这些验证器工作正常,此时它们也不会显示

我已经尝试了所有现有的线程,包括下面这个线程,但建议使用更新面板作为包装器。问题是,您不能在其中包含控件,因此我不知道如何确切地测试该建议:

这是HTML代码:

<asp:CustomValidator ID="validProductCode" runat="server"
    ControlToValidate="txtProductCode"
    OnServerValidate="ValidateProductCode"
    ErrorMessage="The product code entered is invalid"
    Display="None" 
    ValidationGroup="IWS"/>

<asp:ValidationSummary ID="ValidationSummary1" runat="server" ShowMessageBox="True" ShowSummary="False" ValidationGroup="IWS" />

您的问题是,验证摘要中的消息框仅在中的客户端验证阶段显示,并且是从
ValidationSummaryOnSubmit
函数调用的,该函数是从
Page\u ClientValidate
函数调用的:

function Page_ClientValidate(validationGroup) {
    Page_InvalidControlToBeFocused = null;
    if (typeof(Page_Validators) == "undefined") {
        return true;
    }
    var i;
    for (i = 0; i < Page_Validators.length; i++) {
        ValidatorValidate(Page_Validators[i], validationGroup, null);
    }
    ValidatorUpdateIsValid();
    ValidationSummaryOnSubmit(validationGroup);
    Page_BlockSubmit = !Page_IsValid;
    return Page_IsValid;
}
使其一致工作的唯一方法是为自定义验证器添加客户端验证函数,并将服务器端验证函数作为web服务方法公开

第一步是添加
ClientValidationFunction

<asp:CustomValidator ID="validProductCode" runat="server"
    ControlToValidate="txtProductCode"
    OnServerValidate="ValidateProductCode"
    ClientValidationFunction="validateProductCode"
    ErrorMessage="The product code entered is invalid"
    Display="None" 
    ValidationGroup="IWS"/>
第三步是定义客户端脚本验证函数,并使用
JQuery.ajax
调用调用
ValidateProductCode
方法。请注意,我不建议在这里使用
PageMethods
,因为在验证程序函数中,我们需要对服务器进行“同步”调用,最简单的方法是使用JQuery:

<script language="javascript">
    function validateProductCode(sender, args) {

        var txtProductCodeClientId = "<%= txtProductCode.ClientID %>";
        var productCodeValue = ValidatorGetValue(txtProductCodeClientId);

        var ddlSiteIdClientId = "<%= ddlSiteId.ClientID %>";
        var ddlSiteIdValue = ValidatorGetValue(ddlSiteIdClientId);

        var isValid;
        var parameters = {
            siteId: ddlSiteIdValue,
            productCode: productCodeValue
        };
        $.ajax({
            type: "POST",
            async: false,
            url: "<%= Page.ResolveUrl("~/<RELATIVE PATH TO YOUR PAGE>/ValidateProductCode") %>",
            data: parameters,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (response) {
                isValid = response.d;
            },
            error: function() {
                isValid = false;
            }
        });

        args.IsValid = isValid;
    }
</script>

函数validateProductCode(发送方,参数){
var txtProductCodeClientId=“”;
var productCodeValue=ValidatorGetValue(txtProductCodeClientId);
var ddlSiteIdClientId=“”;
var ddlSiteIdValue=ValidatorGetValue(ddlSiteIdClientId);
var是有效的;
变量参数={
siteId:ddlSiteIdValue,
productCode:productCodeValue
};
$.ajax({
类型:“POST”,
async:false,
url:“”,
数据:参数,
contentType:“应用程序/json;字符集=utf-8”,
数据类型:“json”,
成功:功能(响应){
isValid=response.d;
},
错误:函数(){
isValid=false;
}
});
args.IsValid=IsValid;
}

请注意,只要
txtProductCode
更改其值并失去焦点(即
onchange
事件),此方法将调用服务器,但这不会自动更新验证摘要,因此不会显示任何警报消息。为了避免对服务器进行这种“冗余”调用,您可以在加载文档后清除
txtdroductcode
输入的
onchange
事件处理程序


如果您正在使用FriendlyURL,请快速注意:

要使其正常工作,您需要在路由配置中将
FriendlyUrlSettings.AutoRedirectMode
设置为
重定向模式.Off


如果这不是一个选项,那么您需要设置asmx服务,请参阅MSDN文章。

在函数validateProductCode(发送方,args)中,您可以获得“productCodeValue” 只需使用args.Value:

      var productCodeValue = args.Value;
您不需要:

    var txtProductCodeClientId = "<%= txtProductCode.ClientID %>";
    var productCodeValue = ValidatorGetValue(txtProductCodeClientId);
var txtProductCodeClientId=“”;
var productCodeValue=ValidatorGetValue(txtProductCodeClientId);

要指定参数,请使用“可以执行以下操作”:

   var parameters = { };
   parameters.siteId = ddlSiteIdValue;
   parameters.productCode = productCodeValue;
然后在$.ajax({调用)中的数据参数中,使用以下命令:

   data:  JSON.stringify(parameters)

其他验证器具有ValidationGroup=“IWS”?您是否也在控件(按钮、链接按钮等)上设置了此ValidationGroup启动验证?是的,我已经这样做了。我添加了尝试组和不尝试组,结果是一样的。当我将customvalidator更改为display=none时,一切都停止了。刚刚发现:或者这个@jbutler483,这是一个完全不同的问题和不同的验证程序。该用户想知道为什么消息没有显示,但它没有显示是因为未设置错误消息。这可能会有所帮助:我尝试了此操作,但仍然存在其他验证程序未显示的问题。我在页面加载上为必填字段和正则表达式设置了多个验证程序,我也将它们添加到了IWS组中,但它们无法正常工作。而且,这不会影响co无论您输入什么,产品代码上的de都会验证并显示错误。@connersz那么我不确定您的案例中发生了什么。在回答这个问题之前,我创建了一个新项目,并使用了
RequiredFieldValidator
RegularExpressionValidator
与您描述的设置。因此,我发布的代码是verified正在工作。知道这个答案有什么问题很有趣,所以它得到了否决票。我想得到一个反馈:)它没有解决问题,它和以前一样。最后我不得不编写一个全新的验证程序控件,但它仍然不会显示在同一个验证摘要中。我必须使用第二个验证摘要框。
    var txtProductCodeClientId = "<%= txtProductCode.ClientID %>";
    var productCodeValue = ValidatorGetValue(txtProductCodeClientId);
   var parameters = { };
   parameters.siteId = ddlSiteIdValue;
   parameters.productCode = productCodeValue;
   data:  JSON.stringify(parameters)