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)