طريقة أنيقة لجعل CustomValidator العمل مع ValidationSummary messagebox

StackOverflow https://stackoverflow.com/questions/811734

سؤال

أنا واجهت هذه المشكلة من قبل لكن ليس حلها.لقد شكل مع عدة المصادقون و أيضا CustomValidator.

<asp:Label ID="lblMemberNum" runat="server" Text="Membership #:" CssClass="LabelMedium"  ></asp:Label>
<asp:TextBox ID="txtMemberNum" runat="server" CssClass="TextBox" ></asp:TextBox>
<asp:RequiredFieldValidator ID="rfvMemberNum" SetFocusOnError="True" runat="server"
    ControlToValidate="txtMemberNum" ErrorMessage="[ Membership # ] is required"
    CssClass="ValidationMessage" Display="Dynamic" >*</asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="revMemberNum"  Display="Dynamic" runat="server" 
    ControlToValidate="txtMemberNum" CssClass="ValidationMessage" 
    ErrorMessage="[ Membership # ] can only contain letters" 
    ValidationExpression="^([a-zA-Z\d]+)$" >*</asp:RegularExpressionValidator>
<asp:CustomValidator ID="cvMemberNum" runat="server" 
    CssClass="ValidationMessage" Display="Dynamic"
    ControlToValidate="txtMemberNum" ValidateEmptyText="false"
    OnServerValidate="cvMemberNum_Validate" 
    ErrorMessage="This membership number is already registered">*</asp:CustomValidator>

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

و على جانب الملقم:

protected void cvMemberNum_Validate(object source, ServerValidateEventArgs args)
{
    try
    {
        args.IsValid  = (!CampaignRegistration.IsMemberRegistered(args.Value));
    }
    catch
    {
        args.IsValid = false;
    }
}

مشكلتي هي:على ValidationSummary لم يظهر رسالة من CustomValidator.وقد تم طرح هذا السؤال في عدة أماكن ، ولكن أنا لم أر إجابة مرضية.

هل كانت مفيدة؟

المحلول

حاول استخدام ValidationGroup الملكية في جميع المصادقون و ValidationSummary.

تحرير: احتمال آخر يمكن أن يكون الخادم رمز التحقق من الصحة

args.IsValid = (!CampaignRegistration.IsMemberRegistered(args.Value));

إذا CampaignRegistration.IsMemberRegistered(args.Value) تعود كاذبة "!" يجعل صحيح وبالتالي يجعلها صالحة.أعتقد أن عليك التخلص من "!" على النحو التالي:

args.IsValid = CampaignRegistration.IsMemberRegistered(args.Value);

تحديث: من أجل ValidationSummary إلى عرض مخصص المصادقة رسالة في messagebox, تحتاج إلى أن يكون ClientValidationFunction التعليمات البرمجية.إذا كنت تحتاج إلى عرض فقط ملخص دون منبثقة ، ليس هذا هو المطلوب.

<asp:CustomValidator ID="cvMemberNum" runat="server" 
    CssClass="ValidationMessage" Display="Dynamic"
    ControlToValidate="txtMemberNum" ValidateEmptyText="false"
    OnServerValidate="cvMemberNum_Validate"
    ClientValidationFunction = "ClientValidate"  
    ErrorMessage="This membership number is already registered">*</asp:CustomValidator>
   //JavaScript Code.
   function ClientValidate(source, args)
   {         
      args.IsValid = false; //you need to add validation logic here
   }

المزيد: إذا كنت لا تريد أن تفعل ClientSide التحقق من صحة, جرب هذه الخدعة لإظهار حالة تأهب.إجراء هذا التغيير إلى CustomValidator ServerValidate الطريقة:

protected void cvMemberNum_Validate(object source, ServerValidateEventArgs args)
{
    bool isValid = true;
    try
    {
        isValid  = (!CampaignRegistration.IsMemberRegistered(args.Value));
    }
    catch
    {
        isValid = false;
    }
    args.IsValid = isValid;

    if(!isValid)
    {
       if(!Page.IsClientScriptBlockRegistered("CustomValidation")) 
         Page.RegisterClientScriptBlock("CustomValidation", "<script>alert('This membership number is already registered');</script>"); 

    }

}

نصائح أخرى

ShowMessageBox الخيار تماما من جانب العميل، لذلك سوف تقيم إلا إذا كنت قد وضعت في ClientValidationFunction على في CustomValidator .

ويمكنك أيضا أنها وهمية عن طريق تسجيل السيناريو الذي يجعل تنبيه، وذلك عندما نعود من التحقق من صحة الخادم، وأنها سوف تدفع مع رسالة الخطأ. هذا إما أن تكون مسجلة في طريقة ServerValidate (في <لأ href = "https://stackoverflow.com/questions/811734/elegant-way-to-make-customvalidator-work-with-validationsummary-messagebox/811761#811761" >Jose باسيليو )، أو يمكنك الاتصال الأسلوب التالي خلال هذا الحدث عرض مسبق لتسجيل منبثقة مع جميع المصادقون غير صالحة على الصفحة:

    /// <summary>
    /// Registers a script to display error messages from server-side validation as the specified <see cref="UserControl"/> or <see cref="Page"/> loads from a postback.
    /// </summary>
    /// <remarks>
    /// Must be called in the PreRender if used to validate against the Text property of DNNTextEditor controls, otherwise Text will not be populated.
    /// Must set the ErrorMessage manually if using a resourcekey, otherwise the resourcekey will not have overridden the ErrorMessage property.
    /// </remarks>
    /// <param name="ctrl">The <see cref="UserControl"/> or <see cref="Page"/> which is being posted back.</param>
    /// <param name="validationGroup">The validation group against which to validate.</param>
    public static void RegisterServerValidationMessageScript(TemplateControl ctrl, string validationGroup)
    {
        if (ctrl != null && ctrl.Page.IsPostBack)
        {
            ctrl.Page.Validate(validationGroup);
            if (!ctrl.Page.IsValid)
            {
                StringBuilder errorMessage = new StringBuilder("<script language='javascript'>alert('");
                for (int i = 0; i < ctrl.Page.Validators.Count; i++)
                {
                    IValidator validator = ctrl.Page.Validators[i];
                    if (!validator.IsValid)
                    {
                        errorMessage.Append("- " + validator.ErrorMessage);
                        if (i < ctrl.Page.Validators.Count - 1)
                        {
                            errorMessage.Append(@"\r\n");
                        }
                    }
                }

                errorMessage.Append("');</script>");
                ctrl.Page.ClientScript.RegisterStartupScript(typeof(IValidator), "validationAlert", errorMessage.ToString(), false);
            }
        }
    }

ولقد قمت مؤخرا نفس المشكلة. وقد ValidationSummary لا تظهر ERRORMESSAGE من CustomValidator عندما ذكرت ServerValidate فشل التحقق من الصحة. منذ افتراضيا (كما اظهرت ضعي القليل من الهندسة العكسية) ملخص التحقق من صحة يتم تقديم العميل على إعادة النشر لقد ببساطة وأضاف السيناريو الذي يتحقق كل المصادقون على وثيقة استكمال إعادة النشر الحمل / المتزامن ويطلق التحقق من صحة إنشاء ملخص لمجموعات المصادقة فشل:

$(document).ready(function () {
    var displayAlert = function () {
        if (typeof Page_Validators == 'undefined') return;

        var groups = [];
        for (i = 0; i < Page_Validators.length; i++)
            if (!Page_Validators[i].isvalid) {
                if (!groups[Page_Validators[i].validationGroup]) {
                    ValidationSummaryOnSubmit(Page_Validators[i].validationGroup);
                    groups[Page_Validators[i].validationGroup] = true;
                }
            }
    };

    displayAlert();

    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(
                    function () {
                        displayAlert();
                    });
}
);

في السيناريو بلدي كنت قد تتداخل عناصر تحكم المستخدم مع المصادقون، لوحة التحديث وملخص التحقق من صحة في الصفحة الرئيسية.

مزيد من التفاصيل هنا.

ويجب عليك أن تكتب خاصية

وValidationGroup="ValidationSummary1"

وعلى كل مدقق في قضيتك.

وتحقق أيضا إذا صفحتك

AutoEventWireup="true"

وهذا عمل بالنسبة لي:

<asp:CustomValidator runat="server" ID="cv" 
ClientValidationFunction="ValidateFunction"
ErrorMessage="Default error
message">*</asp:CustomValidator>

<script type="text/javascript">
function ValidateFunction(sender, args) 
{

var msg ='';
var formValid = true;

[various checks setting msg and formValid]

if (msg.length > 0) { sender.errormessage = msg; }
args.IsValid = formValid;

}
</script>

وRegisterServerValidationMessageScript bduke هو "تزوير"، ولكن الأمر ليس كذلك. انها حقا حل المشكلة. كل مساحة المساعدة يحتاج هذه الوظيفة في مكان ما.

ولقد وجدت حلا لعندما يكون جافا سكريبت المعوقين وValidationSummary لا تظهر خاصية errorMessage من CustomValidator. هذا هو المطلوب عن طريق الحقن النصي أو التنبيهات، كما هو موضح أعلاه، لن ينجح.

وإضافة عنصر تحكم المصادقة جديدة، دعنا نسميها CustomValidatorProxy، تعيين الخاصية ControlToValidate لأي واحد من عناصر التحكم على النموذج وEnableClientScript=false.

وضمن معالج الأحداث ServerValidate إجراء التحقق من الصحة على عهدك وإذا التحقق من صحة فشل تعيين الخاصية IsValid من CustomValidator وCustomValidatorProxy إلى false وتعيين بالمثل كل من العقارات ErrorMessage.

إذا تم تمرير التحقق من الصحة في ServerValidate ضمان أن يتم تعيين الخاصية IsValid من CustomValidatorProxy إلى true.

وزودت CustomValidatorProxy المعروض على CustomValidator في ValidatorCollection من الصفحة ثم سيتم عرض معالج ServerValidate ستتجاوز قيمة العقار IsValid أن CustomValidatorProxy قد عاد بعد التحقق من صحة القيمة ControlToValidate وErrorMessage بك من CustomValidator الخاصة بك في ValidationSummary.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top