服务器控件的学习-生成用于回发的客户端脚本

只有两个 HTML 窗体元素(“按钮”(Button) 和“图像按钮”(ImageButton))引起窗体回发。如果自定义控件呈现不引起回发的 HTML 元素(如“文本框”(TextBox) 或“链接按钮”(LinkButton)),而您希望控件启动回发,则可以在 ASP.NET 中通过依靠客户端脚本(JScript、JavaScript)的事件结构进行编程来实现这一功能。

Protected Overrides Sub Render(output As HtmlTextWriter)
   output.Write("<a  id=""" & Me.UniqueID &   """ href=""javascript:" & Page.GetPostBackEventReference(Me) & """>")
   output.Write(" " & Me.UniqueID & "</a>")
End Sub

GetPostBackEventReference 方法发出启动回发的客户端脚本,并且还提供对启动回发事件的控件的引用。

在解释后的HTML源代码中是类似这样子滴
'****************************************************************************************************
<html>
<body>
<form name="ctrl2" method="POST" action="MyLinkButton.aspx" id="ctrl2">
<input type="hidden" name="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" value="dDwtMjI1NTgwNDE2Ozs+eIZ+AfRvoCj1nWimbh+zPv/rKNg=" />                 
Here is the custom link button.<br>
<a  id ="Link" href="javascript:__doPostBack('Link','')"> Link</a>
<br><br>
<input name="TextBox" type="text" value="Click the link" id="TextBox" style="background-color:Cyan;width:200px;" />
<br>                                               
<script language="javascript">
<!--
      function __doPostBack(eventTarget, eventArgument) {
            var theform = document.ctrl2
            theform.__EVENTTARGET.value = eventTarget
            theform.__EVENTARGUMENT.value = eventArgument
            theform.submit()
      }
// -->
</script>
</form>                 
</body>                       
</html>

'*****************************************************************************************************

这里有一个很有意思的问题,那就是双引号的嵌套使用
刚开始看不懂”””和””的用法,经过资料查看,原来asp会将两个双引号转成一个双引号输出,就明白了。


在非窗体控件中保持客户端更改

客户端 ECMAScript(JScript、JavaScript)可用于跟踪不是窗体元素的控件中的客户端状态更改。此类控件不具有通过窗体提交将数据回发到服务器的方法。执行事件回发是可能的,但没有意义。通过将携带数据的隐藏输入域用于此类控件可以解决这一问题。控件必须在窗体提交之前的某一时刻发出隐藏输入域并发出将状态信息插入这些隐藏域的脚本。当加载控件时,控件可以检索并使用来自隐藏域的数据。为启用此机制,控件可以调用其 Page RegisterHiddenField 方法以发出隐藏域,并实现 IPostBackDataHandler 接口来恢复该隐藏域的值并更新其属性。

下面的示例说明此情形。示例 (DHtmlControl) 中的控件发出一个范围,当选择该范围时其颜色在客户端上发生更改。该控件发出一个隐藏变量,该变量的值由客户端脚本设置为一个布尔变量,以指示是否已选择该控件。此控件公开一个布尔属性 (Selected),该属性指示是否已在客户端上选择该控件。该控件实现 IPostBackDataHandler 接口,以便在将此页发送到服务器时,该控件可以读取隐藏域的值并更新其 Selected 属性。该控件还公开事件 (SelectedChanged),如果在客户端上选择该控件时将引发此事件。


Option Explicit
Option Strict

Imports System
Imports System.Collections
Imports System.Collections.Specialized
Imports System.Drawing
Imports System.Web
Imports System.Web.UI
Imports Microsoft.VisualBasic

Namespace CustomControls
   Public Class DHtmlControl
      Inherits Control
      Implements IPostBackDataHandler
      Public Event SelectedChanged As EventHandler
     
      Public Property Text() As String
         Get
            Dim obj As Object = ViewState("Text")
            If obj Is Nothing Then
               Return String.Empty
            Else
               Return CStr(obj)
            End If
         End Get
        
         Set
            ViewState("Text") = value
         End Set
      End Property
     
      Public Property Selected() As Boolean
         Get
            Dim obj As Object = ViewState("Selected")
            If obj Is Nothing Then
               Return False
            Else
               Return CBool(obj)
            End If
         End Get
        
         Set
            ViewState("Selected") = value
         End Set
      End Property
     
      Protected ReadOnly Property HelperID() As String
         Get
            Return "__" & ClientID & "_State"
         End Get
      End Property
     
      Protected Overrides Sub OnInit(e As EventArgs)
         MyBase.OnInit(e)
        
         If Not (Page Is Nothing) Then
            Page.RegisterRequiresPostBack(Me)
         End If
      End Sub
     
      Protected Overrides Sub OnPreRender(e As EventArgs)
         MyBase.OnPreRender(e)
        
         If Not (Page Is Nothing) Then
            Page.RegisterHiddenField(HelperID, Selected.ToString())
         End If
      End Sub
     
      Protected Overrides Sub Render(writer As HtmlTextWriter)
         Dim postback As String = ""
         If Not (Page Is Nothing) Then
            postback = Page.GetPostBackEventReference(Me) & ";"
         End If
        
         Dim click As String = "οnclick=""var sel=getAttribute('selected'); sel = (sel.toLowerCase() == 'true'); sel=!sel; setAttribute('selected', sel.toString());this.style.backgroundColor=sel?'red':'white';" & HelperID & ".value=sel.toString();" & postback & """"
         Dim style As String = "style=""cursor:hand;background-color:" & IIf(Selected, "red", "white").ToString() & """"
         Dim selectedPiece As String = "selected=""" & Selected.ToString() & """"
         writer.Write(("<span " & style & " " & click & " " & selectedPiece & ">" & Text & "</span>"))
      End Sub
     
      Function LoadPostData(postDataKey As String, postCollection As NameValueCollection) As Boolean Implements IPostBackDataHandler.LoadPostData
         Dim value As String = postCollection(HelperID)
        
         If Not (value Is Nothing) Then
            Dim newValue As Boolean = String.Compare(value, "true", True) = 0
            Dim oldValue As Boolean = Selected
           
            Selected = newValue
           
            ' If there is a change, raise a change event.
            Return newValue <> oldValue
         End If
        
         Return False
      End Function
     
      Sub RaisePostDataChangedEvent() Implements IPostBackDataHandler.RaisePostDataChangedEvent
         ' There was a change, so raise any events.
         RaiseEvent SelectedChanged(Me, EventArgs.Empty)
      End Sub
   End Class
End Namespace

 

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值