客户验证程序错误不会显示在验证摘要中

时间:2014-08-01 11:11:19

标签: c# asp.net validation webforms

我在页面中添加了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);
    }
}

3 个答案:

答案 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)