Я создаю пользовательский серверный элемент управления для генерации элементов кнопок с определенной разметкой и обработчиками JavaScript для моего приложения Web Forms. Они, конечно, могут вызывать обратные передачи, поэтому я бы хотел, чтобы они работали с любым из средств проверки ASP для проверки формы, особенно с клиентской стороны.
Этот серверный элемент управления кнопки поддерживает свойство OnClientClick
для испускания атрибута onclick
в теге кнопки с предоставленным кодом (в основном используется для простого повторного подтверждения подтверждения, когда пользователь нажимает кнопку удаления для представления списка или аналогичного). поэтому использование метода элемента управления 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
соединит проверку на стороне клиента, но, похоже, это не работает, как я предполагал. При необходимости jQuery доступен для использования в привязке дополнительной обработки к событию нажатия кнопки:
Пользовательское управление кнопками сервера
<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
, чтобы определить, равны ли два поля сброса пароля перед отправкой обратно на сервер, и при этом проверка не происходит, когда запрос поступает на сторону сервера.