ClickOnce按钮服务器控件

分享于 

7分钟阅读

Web开发

  繁體 雙語

介绍

回到经典的ASP时代,当我们想阻止最终用户重复提交提交按钮时,我们将用JavaScript禁用按钮。 但是用 ASP.NET 就不再那么简单了。 禁用任何表单元素客户端时,实际上会禁用它的服务器端,因为它的NAME 值对不会随表单post一起发送。 这一点的缺点是 button_click 事件现在呈现为无用的。 永远不会被提升 !

为了避免这个问题,我搜索了 ASP.NET 论坛,我看到了几个不错的工作,但是在点击按钮后,没有提供rendering按钮的效果。 所以我找到了我自己的。 输入 ClickOnceButton 服务器控件。

服务器控件的行为与内部按钮控件完全一样,但有两个新属性: DisableAfterClickDisabledText

DisableAfterClick 为 true 时,按钮将在单击后被禁用客户端。 设置 DisabledText 后,按钮的文本将在禁用按钮后设置为 DisabledText。 如果你想获得一个 li'l 可视提示( 如将按钮的文本更改为'处理。')。

主要工作发生在 AddAttributesToRender 事件中:

ProtectedOverridesSub AddAttributesToRender(ByVal writer As HtmlTextWriter)
 Dim strOnClick AsStringIf IsNothing(MyBase.Page) ThenMyBase.Page.VerifyRenderingInServerForm(Me)
 EndIf writer.AddAttribute(HtmlTextWriterAttribute.Type, "submit")
 writer.AddAttribute(HtmlTextWriterAttribute.Name, MyBase.UniqueID)
 writer.AddAttribute(HtmlTextWriterAttribute.Value, Me.Text)
 IfNot IsNothing(MyBase.Page) AndMe.CausesValidation_
 AndMyBase.Page.Validators.Count> 0ThenIfMe.DisableAfterClick Then strOnClick = Me.GetClickOnceClientValidateEvent()
 Else strOnClick = Me.GetClientValidateEvent()
 EndIfIfMyBase.Attributes.Count> 0AndNot _
 IsNothing(MyBase.Attributes("onclick")) Then strOnClick = String.Concat(MyBase.Attributes("onclick"), strOnClick)
 MyBase.Attributes.Remove("onclick")
 EndIf writer.AddAttribute("language", "javascript")
 writer.AddAttribute(HtmlTextWriterAttribute.Onclick, strOnClick)
 ElseIf DisableAfterClick = TrueThen strOnClick = Me.GetOnceClickJavascript()
 IfMyBase.Attributes.Count> 0AndNot _
 IsNothing(MyBase.Attributes("onclick")) Then strOnClick = String.Concat(MyBase.Attributes("onclick"), strOnClick)
 MyBase.Attributes.Remove("onclick")
 EndIf writer.AddAttribute("language", "javascript")
 writer.AddAttribute(HtmlTextWriterAttribute.Onclick, strOnClick)
 EndIfMyBase.AddAttributesToRender(writer)EndSub

这将以编程方式创建按钮,并确定该按钮是否导致验证,或者在页面上只需要禁用按钮。 你会注意到它叫三个不同的不同属性。 这些就是让魔法发生的原因。 它们如下所示:

FriendReadOnlyProperty GetClientValidateEvent() AsStringGetReturn"if (typeof(Page_ClientValidate) _
 == 'function') Page_ClientValidate();"EndGetEndPropertyFriendReadOnlyProperty GetClickOnceClientValidateEvent() AsStringGetReturn"if (typeof(Page_ClientValidate) == 'function') _
 { if(Page_ClientValidate()) {" + _
 GetOnceClickJavascript + " }} else {" + _
 GetOnceClickJavascript + " }"EndGetEndPropertyFriendReadOnlyProperty GetOnceClickJavascript() AsStringGetReturn"document.getElementsByName('" + _
 Me.OnceClickBtnName + "').item(0).setAttribute('name'," + _
 "this.getAttribute('name')); this.disabled = true;" + _
 IIf(DisabledText = String.Empty, String.Empty, _
 "this.value = '" + DisabledText + "';") + _
 "this.form.submit();"EndGetEndProperty

如果按钮控件导致验证,并且页面上有验证器,则 GetClientValidateEvent() 将返回与框架通常附加的相同的JavaScript。 这是为了处理页面上有按钮的场景,点击后不会禁用,并且你有验证器。

属性 GetClickOnceClientValidateEvent() 返回 上面 脚本的稍微修改过的版本。 当页面上有确认器并且你希望在单击后禁用按钮时,就会处理这个场景。 但是,如果 Page_ClientValidate() 返回 true 或者非 IE 浏览器,则只要禁用它,就会禁用按钮并提交。

属性 GetOnceClickJavascript() 返回禁用按钮禁用按钮的基本 JavaScript。 它还可以确保按钮在文章中被发送,这样按钮就会被引发。 它通过将隐藏字段的NAME 属性与按钮的NAME 交换来实现。 框架只需要查看发送的控件的名称/id,以提高它的点击事件。 隐藏字段在控件事件的OnInit(EventArgs) 中注册。

ProtectedOverridesSub OnInit(ByVal e As EventArgs)
 IfMe.DisableAfterClick AndNotMe.IsHiddenFieldRegistered ThenMyBase.Page.RegisterHiddenField(Me.OnceClickBtnName, "")
 EndIfMyBase.OnInit(e)EndSubPrivateFunction IsHiddenFieldRegistered() AsBooleanForEach ctl As Control InMyBase.Page.Controls
 IfTypeOf ctl Is HtmlControls.HtmlInputHidden ThenIf ctl.ID = Me.OnceClickBtnName ThenReturnTrueEndIfEndIfNextReturnFalseEndFunction

OnceClickBtnValue的默认常量值是 __onceClickBtnIsHiddenFieldRegistered 函数只确保字段已经注册一次。 这允许我们在窗体上有一个上的按钮,在单击后禁用。

你可能想知道为什么我不只是从 System.Web.UI.WebControls.Button 类中 inherit。 原因是 AddAttributesToRender 事件。 如果不这样做的话,我就不需要在整个过程中创建属性,函数,等等,所以我还需要调用 MyBase.AddAttributesToRender,然后再调用 System.Web.UI.WebControls.WebControl 类。如果我继承了 Button 类,我最终会得到两个 onclick s,并且在验证时不能控制输出的JavaScript。 这给了我完整的控制。

要在自己的项目中使用这个程序,只需将clickoncebutton程序集添加到工具箱中并拖放到你的webform上,然后将它的设置为 ! enjoy!

注意:在 IE 6.0和 7.0上测试了. NET 框架的版本 1.1.


相关文章