我在页面中添加了CustomValidator
,验证了服务器端的输入。
验证工作正常,并在屏幕无效时显示错误消息,但如果我将其更改为在validationsummary
页面内显示isvalid=false
,但validationsummary
从未显示。
我在屏幕上还有其他验证器(RegularExpression
,RequiredField
)工作正常,直到我更改CustomValidator
的查看模式,此时他们不会显示任
我已经尝试了所有现有的线程,包括这个(下面),但建议使用更新面板作为包装器。问题是你不能在其中包含控件,所以我不确切知道如何测试这个建议:
Why The error message for custom validator is not shown in message box?
这是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" />
这是C#
protected void ValidateProductCode(object source, ServerValidateEventArgs args)
{
try
{
using (SqlConnection conn = new SqlConnection(GetConnection.GetConnectionString()))
using (SqlCommand sqlComm = new SqlCommand("PL_ProductCodes_FillScreen", conn))
{
sqlComm.Parameters.AddWithValue("@SiteID", ddlSiteId.SelectedValue);
sqlComm.Parameters.AddWithValue("@ProductCode", txtProductCode.Text);
sqlComm.Parameters.AddWithValue("@IsOntext", 1);
sqlComm.CommandType = CommandType.StoredProcedure;
SqlDataAdapter da = new SqlDataAdapter(sqlComm);
DataSet ds = new DataSet();
da.Fill(ds);
args.IsValid = ds.Tables[0].Rows.Count != 0;
}
}
catch (SqlException ex)
{
ExceptionHandling.SQLException(ex, constPageID, constIsSiteSpecific);
}
}
答案 0 :(得分:0)
您的问题是验证摘要中的消息框仅在客户端验证阶段显示,并从ValidationSummaryOnSubmit
函数调用,该函数从Page_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;
}
以下是来自ValidationSummaryOnSubmit
的代码段,它会创建错误消息列表并显示alert
:
if (summary.showmessagebox == "True") {
s = "";
if (typeof(summary.headertext) == "string") {
s += summary.headertext + "\r\n";
}
var lastValIndex = Page_Validators.length - 1;
for (i=0; i<=lastValIndex; i++) {
if (!Page_Validators[i].isvalid && typeof(Page_Validators[i].errormessage) == "string") {
switch (summary.displaymode) {
case "BulletList":
default:
s += "- " + Page_Validators[i].errormessage;
if (i < lastValIndex) {
s += "\r\n";
}
break;
// Other cases omitted to shorten the snippet
}
}
}
alert(s);
}
使其一致工作的唯一方法是为自定义验证器添加客户端验证功能,并将服务器端验证功能公开为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"/>
第二步是修改服务器端的验证方法:
protected void ValidateProductCode(object source, ServerValidateEventArgs args)
{
args.IsValid = ValidateProductCode(ddlSiteId.SelectedValue, txtProductCode.Text);
}
// This method would be called both from the client and server side
[WebMethod]
public static bool ValidateProductCode(string siteId, string productCode)
{
try
{
using (SqlConnection conn = new SqlConnection(GetConnection.GetConnectionString()))
using (SqlCommand sqlComm = new SqlCommand("PL_ProductCodes_FillScreen", conn))
{
sqlComm.Parameters.AddWithValue("@SiteID", siteId);
sqlComm.Parameters.AddWithValue("@ProductCode", productCode);
sqlComm.Parameters.AddWithValue("@IsOntext", 1);
sqlComm.CommandType = CommandType.StoredProcedure;
SqlDataAdapter da = new SqlDataAdapter(sqlComm);
DataSet ds = new DataSet();
da.Fill(ds);
return ds.Tables[0].Rows.Count != 0;
}
}
catch (SqlException ex)
{
ExceptionHandling.SQLException(ex, constPageID, constIsSiteSpecific);
}
return false;
}
第三步是定义客户端脚本验证功能,并使用ValidateProductCode
调用调用JQuery.ajax
方法。请注意,我建议不要在此处使用PageMethods
,因为在验证程序功能中我们需要执行&#34;同步&#34;调用服务器,简单的方法是使用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>
请注意,只要txtProductCode
更改其值并失去焦点(即onchange
事件),此方法就会调用服务器,但这不会自动更新验证摘要,因此不会发出警告消息将会显示。为了避免造成这样的“多余”#34;调用服务器后,您可以在加载文档后清除onchange
输入的txtProductCode
事件处理程序。
如果您使用的是FriendlyUrls,请注意:
要使其有效,您需要在路线配置中将FriendlyUrlSettings.AutoRedirectMode
设置为RedirectMode.Off
。
如果这不是一个选项,那么您需要设置asmx服务,请参阅Exposing Web Services to Client Script MSDN文章。
答案 1 :(得分:0)
在函数validateProductCode(sender,args)中,您可以获得“productCodeValue” 只需使用args.Value:
var productCodeValue = args.Value;
您不需要:
var txtProductCodeClientId = "<%= txtProductCode.ClientID %>";
var productCodeValue = ValidatorGetValue(txtProductCodeClientId);
答案 2 :(得分:0)
要指定参数,请改为使用:
var parameters = { };
parameters.siteId = ddlSiteIdValue;
parameters.productCode = productCodeValue;
然后在$ .ajax的数据参数中({call,使用this:
data: JSON.stringify(parameters)