باستخدام ValidationGroup و التحقق من جانب العميل مع ASP.NET خادم مخصص التحكم
-
12-11-2019 - |
سؤال
أنا إنشاء مخصص تحكم ملقم زر توليد عناصر محددة العلامات و جافا سكريبت معالجات بلدي نماذج ويب التطبيق.وهي بالطبع قادرة على أن تسبب 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؛هو السر