2017-10-26 3 views
0

자신이 바보라고 느끼고 있습니다. 간단해야하지만 작동하지 않는 것 같습니다. 다음은 제 제어 코드입니다.TextBox에서 WebControls - Postaback에 새 속성을 저장하지 않음

Imports System.Web.UI.WebControls 

Public Class PasswordTextBox 
      Inherits TextBox 
Public Sub New() 
    TextMode = TextBoxMode.Password 
End Sub 

Public Property Password As String 
    Get 
     Dim s As String = CType(ViewState("Password"), String) 
     If s Is Nothing Then Return "" 
     Return s 
    End Get 
    Set(value As String) 
     ViewState("Password") = value 
    End Set 
End Property 

Private Const DEFAULT_PASSWORD As String = "********************" 
Public Overrides Property Text() As String 
    Get 
     If Password = "" Then Return "" 
     Return DEFAULT_PASSWORD 
    End Get 
    Set 
     MyBase.Text = DEFAULT_PASSWORD 
     Attributes("value") = DEFAULT_PASSWORD 
    End Set 
End Property 

Protected Overrides Sub OnPreRender(e As EventArgs) 
    MyBase.OnPreRender(e) 

    Attributes("value") = Text 
End Sub 
Protected Overrides Sub Render(ByVal output As System.Web.UI.HtmlTextWriter) 
    MyBase.Render(output) 
End Sub 

최종 클래스

목적은 간단는, 값으로 ***** 항상 표시하는 속성을 덮어 대신/데이터를 설정 얻을 새 속성 암호를 사용하도록. 따라서 사용자가 브라우저에서 "요소 검사"기능을 사용하면 실제 비밀번호를 얻을 수 없습니다.

그러나 페이지 포스트 백에서 txtPassword.Password 속성을 얻으면 빈 문자열을 반환합니다.

누락 된 것이 있습니까? 감사합니다.

답변

0

좋아, 문제를 찾을 수있었습니다. IPostBackDataHandler를 상속 받아 LoadPostData 메서드를 재정의해야했습니다.

새 클래스는 아래와 같습니다.

Imports System.Web.UI 
Imports System.Web.UI.WebControls 


Public Class PasswordTextBox 
     Inherits TextBox 
     Implements IPostBackDataHandler 

Public Sub New() 
    TextMode = TextBoxMode.Password 
End Sub 

Public Property Password As String 
    Get 
     Dim s As String = CType(ViewState("Password"), String) 
     If s Is Nothing Then Return "" 
     Return s 
    End Get 
    Set(value As String) 
     ViewState("Password") = value 
    End Set 
End Property 

Private Const DEFAULT_PASSWORD As String = "********************" 
Public Overrides Property Text() As String 
    Get 
     If Password = "" Then Return "" 
     Return DEFAULT_PASSWORD 
    End Get 
    Set 
     MyBase.Text = DEFAULT_PASSWORD 
     Attributes("value") = DEFAULT_PASSWORD 
    End Set 
End Property 

Protected Overrides Sub OnPreRender(e As EventArgs) 
    MyBase.OnPreRender(e) 

    Attributes("value") = Text 
End Sub 
Protected Overrides Sub Render(ByVal output As System.Web.UI.HtmlTextWriter) 
    MyBase.Render(output) 
End Sub 

Public Overridable Shadows Function LoadPostData(postDataKey As String, postCollection As System.Collections.Specialized.NameValueCollection) As Boolean Implements IPostBackDataHandler.LoadPostData 
    Dim presentValue As String = Password 
    Dim postedValue As String = postCollection(postDataKey) 

    If presentValue Is Nothing OrElse Not presentValue.Equals(postedValue) Then 
     If postedValue <> DEFAULT_PASSWORD Then Password = postedValue 
     Return True 
    End If 

    Return False 
End Function 

End Class