【问题标题】:The customer validator error won't show inside the validation summary客户验证器错误不会显示在验证摘要中
【发布时间】:2014-08-01 11:11:19
【问题描述】:

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

我还有其他验证器(RegularExpressionRequiredField)在屏幕上工作正常,直到我更改 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);
    }
}

【问题讨论】:

  • 其他验证器有 ValidationGroup = "IWS"?您是否还在启动验证的控件(Button、LinkBut​​ton 等)上设置了此 ValidationGroup?
  • 是的,我已经做到了。我添加了尝试和不使用该组,结果是相同的。一旦我将 customvalidator 更改为 display=none,它就会停止。
  • @jbutler483 这是一个完全不同的问题和不同的验证器。该用户想知道为什么该消息不显示,但这是因为未设置错误消息。
  • 这可能会有所帮助:stackoverflow.com/questions/811734/…

标签: c# asp.net validation webforms


【解决方案1】:

您的问题是验证摘要中的消息框仅在客户端验证阶段显示,并从 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 的sn-p,它创建错误消息列表并显示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;
}

第三步是定义客户端脚本验证函数并使用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>

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


如果您使用 FriendlyUrls,请注意:

要使其正常工作,您需要在路由配置中将 FriendlyUrlSettings.AutoRedirectMode 设置为 RedirectMode.Off

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

【讨论】:

  • 我试过了,但我仍然遇到其他验证器没有显示的问题。我在页面加载时为必填字段和正则表达式设置了几个验证器,我也将它们添加到 IWS 组中,但它们仍然无法正常工作。
  • 此外,无论您输入什么,它都不会点击产品代码验证上的代码并显示错误。
  • @connersz 然后我不确定你的情况发生了什么。在回答问题之前,我已经创建了一个新项目,并在您描述的设置中同时使用了 RequiredFieldValidatorRegularExpressionValidator。因此,我发布的代码经过验证可以正常工作。
  • 知道这个答案有什么问题很有趣,所以它被否决了。我喜欢有反馈:)
  • 没有解决问题,还是和以前一样。最后,我不得不编写一个全新的验证器控件,但这仍然不会显示在相同的验证摘要中。我必须使用第二个验证摘要框。
【解决方案2】:

在函数validateProductCode(sender, args)中,可以得到“productCodeValue” 只需使用 args.Value:

      var productCodeValue = args.Value;

你不需要:

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

【讨论】:

    【解决方案3】:

    要指定您的参数,使用可以改为:

       var parameters = { };
       parameters.siteId = ddlSiteIdValue;
       parameters.productCode = productCodeValue;
    

    然后在你的 $.ajax({ 调用中的 data 参数中,使用这个:

       data:  JSON.stringify(parameters)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-08
      • 2015-03-03
      相关资源
      最近更新 更多