我正在創建一個自定義服務器控件,爲我的Web窗體應用程序生成具有特定標記和JavaScript處理程序的按鈕元素。當然,它們能夠引起回發,因此我希望它們能夠與任何ASP的驗證控件一起用於表單驗證,尤其是客戶端框架。通過ASP.NET自定義服務器控件使用ValidationGroup和客戶端驗證
此按鈕服務器控件支持OnClientClick
屬性在按鈕標記中發出onclick
屬性並提供了代碼(主要用於在用戶單擊列表視圖或類似對象的刪除按鈕時進行的簡單確認重新提示),因此使用asp:Button
控件將驗證腳本作爲onclick屬性發布的方法將非常不起作用。事實上,在標準asp:Button
上同時指定OnClientClick
和ValidationGroup
屬性的結果非常糟糕。下面是爲什麼不工作開箱的痛苦明顯的例子:
頁面標記
<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
屬性之外,我無法找到關於如何用一種方法最好地實現這一點的很多文檔。我認爲在重寫的AddAttributesToRender
方法中我調用Page.ClientSCript.RegisterForEventValidation
會連接客戶端驗證,但似乎沒有按照我的假設運行。如果必要的話,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
目前,該代碼不會在同一ValidationGroup
的asp:CompareValidator
發揮作用確定兩個密碼重置字段在發回服務器之前是否相同,一旦請求到達服務器端,驗證也不會發生。
你能提供一個例子,說明OnClientClick將被真實地設置爲什麼(而不僅僅是'return true')嗎? – 2012-03-03 04:50:02
'return confirm(「你確定要刪除這個項目?」)或其他任何重新提示。實際上我已經想到了解決方法,我很快就會發布我的解決方案。它涉及了一點點挖掘ASP.NET的回發處理的內涵,但如果我只是將驗證作爲監聽器添加到click事件上,那麼事情就很好。 – lsuarez 2012-03-03 22:08:41