باستخدام ValidationGroup و التحقق من جانب العميل مع ASP.NET خادم مخصص التحكم

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

سؤال

أنا إنشاء مخصص تحكم ملقم زر توليد عناصر محددة العلامات و جافا سكريبت معالجات بلدي نماذج ويب التطبيق.وهي بالطبع قادرة على أن تسبب postbacks ، لذلك أود منها أن تعمل مع أي من ASP التحقق من صحة ضوابط التحقق من صحة النموذج, وخاصة من جانب العميل الإطار.

هذا زر تحكم ملقم يدعم OnClientClick الملكية تنبعث منها onclick السمة في زر الوسم مع رمز المقدمة (في المقام الأول استخدام بسيط تأكيد reprompt عندما ينقر المستخدم على زر حذف على القائمة عرض أو ما شابه ذلك) ، وذلك باستخدام asp:Button التحكم في طريقة ينبعث منها التحقق من صحة البرنامج النصي كما onclick السمة سوف تكون فعالة جدا.كما واقع الأمر ، التي تحدد OnClientClick و ValidationGroup السمات القياسية asp:Button اتضح بشدة.وهنا من الواضح بشكل مؤلم المثال لماذا لا يعمل من خارج منطقة الجزاء:

ترميز الصفحة

<asp:Button ID="btnSaveAsp" ValidationGroup="vgMyValidationGroup" OnClientClick="return true;" runat="server" />

المقدمة العلامات

<input type="submit" name="ctl00$cphBodyContent$lvMyList$ctrl0$btnSaveAsp" value="Save"  id="cphBodyContent_lvUsers_btnSaveAsp_0"
    onclick='return true; WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cphBodyContent$lvMyList$ctrl0$btnSaveAsp", "", true, "vgMyValidationGroup", "", false, false))'>

هنا هي القائمة غير العاملين رمز الأسلاك حتى تحكم التحقق من الصحة.كنت غير قادر على العثور على الكثير من الوثائق حول أفضل السبل لإنجاز هذا مع طريقة جانبا من انبعاث مماثلة onclick السمة.ظننت ندائي Page.ClientSCript.RegisterForEventValidation في تجاوز AddAttributesToRender الطريقة سلك حتى التحقق من جانب العميل ، ولكن هذا لا يبدو أن تعمل كما يفترض.إذا لزم الأمر, مسج متاح للاستخدام في ملزمة معالجة إضافية على الزر انقر فوق الحدث:

خادم مخصص زر التحكم

<ToolboxData("<{0}:Button runat=server></{0}:Button>")> _
<ParseChildren(False)> _
<PersistChildren(True)> _
Public Class Button
    Inherits System.Web.UI.WebControls.WebControl
    Implements IPostBackDataHandler

    Public Sub New()
        MyBase.New(HtmlTextWriterTag.Button)
    End Sub

    <Category("Behavior")> _
    <DefaultValue("")> _
    Public Overridable Property PostBackUrl As String
        Get
            Return If(ViewState("PostBackUrl"), String.Empty)
        End Get
        Set(value As String)
            ViewState("PostBackUrl") = value
        End Set
    End Property

    <Category("Validation")> _
    <DefaultValue(True)> _
    Public Overridable Property CausesValidation As Boolean
        Get
            Return If(ViewState("CausesValidation"), True)
        End Get
        Set(value As Boolean)
            ViewState("CausesValidation") = value
        End Set
    End Property

    <Category("Validation")> _
    <DefaultValue("")> _
    Public Overridable Property ValidationGroup As String
        Get
            Return If(ViewState("ValidationGroup"), String.Empty)
        End Get
        Set(value As String)
            ViewState("ValidationGroup") = value
        End Set
    End Property

    <Category("Behavior")> _
    <DefaultValue("")> _
    <Description("Client-side script to be run when the button is clicked.")> _
    Public Property OnClientClick As String
        Get
            Return If(ViewState("OnClientClick"), String.Empty)
        End Get
        Set(value As String)
            ViewState("OnClientClick") = value
        End Set
    End Property

    Protected Overrides Sub AddAttributesToRender(writer As HtmlTextWriter)
        MyBase.AddAttributesToRender(writer)

        If Not String.IsNullOrEmpty(OnClientClick) Then
            writer.AddAttribute(HtmlTextWriterAttribute.Onclick, OnClientClick)
        End If

        Dim postBackOptions = GetPostBackOptions()

        If postBackOptions.TargetControl Is Me Then
            writer.AddAttribute(HtmlTextWriterAttribute.Name, ClientID)
        End If

        If Page IsNot Nothing Then
            Page.ClientScript.RegisterForEventValidation(postBackOptions)
        End If
    End Sub

    Protected Overridable Function GetPostBackOptions() As PostBackOptions
        Dim options As New PostBackOptions(Me) With {
            .ClientSubmit = False
        }

        If Page IsNot Nothing Then
            If CausesValidation AndAlso (Page.GetValidators(ValidationGroup).Count > 0) Then
                options.PerformValidation = True
                options.ValidationGroup = ValidationGroup
            End If

            If Not String.IsNullOrEmpty(PostBackUrl) Then
                options.ActionUrl = HttpUtility.UrlPathEncode(ResolveClientUrl(PostBackUrl))
            End If
        End If

        Return options
    End Function
End Class

حاليا, هذا الكود لا يعمل مع asp:CompareValidator في نفس ValidationGroup لتحديد ما إذا كان اثنين إعادة تعيين كلمة المرور حقول متساوية قبل نشرها مرة أخرى إلى الخادم ، ولا صحة تحدث مرة واحدة على طلب يحصل على جانب الملقم.

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

المحلول

مما يجعل OnClientClick العمل مع العميل التحقق من صحة النموذج

منذ <asp:Button> التحكم يسلسل قيمة OnClientClick مع التحقق من صحة النموذج النصي, أسهل طريقة لجعلها تعمل معا هو return false عندما كنت ترغب في منع تقديم النموذج و لا تفعل شيئا إذا كنت تريد زر التحقق من صحة وتقديم النموذج:

OnClientClick="if (!confirm('Are you sure?')) return false;"

ومع ذلك, إذا كنت على الاطلاق أريد أن أكتب return confirm('Are you sure?'), ثم يمكنك التحرك في شكل رمز التحقق إلى المستمع الحدث (كما تقول), أو يمكنك لف OnClientClick رمز مثل هذا:

writer.AddAttribute(
    HtmlTextWriterAttribute.Onclick,
    "if (!(function() { " + this.OnClientClick + "; return true; })()) return false;" +
    this.Page.ClientScript.GetPostBackEventReference(options, false));

من جانب الملقم التحقق من صحة النموذج

تحتاج إلى تنفيذ IPostBackEventHandler واجهة الاتصال Page.Validate الأسلوب.على ClientScriptManager.RegisterForEventValidation يستخدم أسلوب التحقق من صحة الحدث (منع غير المصرح به أو الخبيثة postbacks) ، ليس من أجل التحقق من صحة النموذج.

نموذج التعليمات البرمجية (C#)

هنا هو رمز البدائي زر مخصص التحكم التي تدعم OnClientClick و ValidationGroup:

[ParseChildren(false)]
[PersistChildren(true)]
public class Button : WebControl, IPostBackEventHandler
{
    private static readonly object EventClick = new object();

    public Button()
        : base(HtmlTextWriterTag.Button)
    {
    }

    public bool CausesValidation
    {
        get { return ((bool?)this.ViewState["CausesValidation"]) ?? true; }
        set { this.ViewState["CausesValidation"] = value; }
    }

    public string ValidationGroup
    {
        get { return (string)this.ViewState["ValidationGroup"] ?? ""; }
        set { this.ViewState["ValidationGroup"] = value; }
    }

    public string OnClientClick
    {
        get { return (string)this.ViewState["OnClientClick"] ?? ""; }
        set { this.ViewState["OnClientClick"] = value; }
    }

    public event EventHandler Click
    {
        add { this.Events.AddHandler(EventClick, value); }
        remove { this.Events.RemoveHandler(EventClick, value); }
    }

    protected override void AddAttributesToRender(HtmlTextWriter writer)
    {
        base.AddAttributesToRender(writer);
        writer.AddAttribute(HtmlTextWriterAttribute.Name, this.UniqueID);

        if (this.Page != null && this.Enabled)
        {
            PostBackOptions options = this.GetPostBackOptions();
            writer.AddAttribute(
                HtmlTextWriterAttribute.Onclick,
                this.OnClientClick + this.Page.ClientScript.GetPostBackEventReference(options, false));
        }
    }

    protected virtual PostBackOptions GetPostBackOptions()
    {
        PostBackOptions options = new PostBackOptions(this) { ClientSubmit = false };

        if (this.Page != null)
        {
            if (this.CausesValidation && this.Page.GetValidators(this.ValidationGroup).Count > 0)
            {
                options.PerformValidation = true;
                options.ValidationGroup = this.ValidationGroup;
            }
        }

        return options;
    }

    protected virtual void OnClick(EventArgs e)
    {
        EventHandler handler = (EventHandler)this.Events[EventClick];

        if (handler != null)
        {
            handler(this, e);
        }
    }

    void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)
    {
        if (this.CausesValidation)
        {
            this.Page.Validate(this.ValidationGroup);
        }

        this.OnClick(EventArgs.Empty);
    }
}

نصائح أخرى

يرجى إلقاء نظرة على تنفيذ زر .NET Framework.وخاصة addattributestorender طريقة.يمكنك بعد ذلك تعديل التعليمات البرمجية لجعلها تعمل بالطريقة التي تريدها: giveacodicetagpre.

مستمر Bui Cuion ما تحتاجه هو هذه الأشياء 2 في CS 1: giveacodicetagpre.

و giveacodicetagpre.

الخيارات. clientsubmit= false؛هو السر

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