Imports BaseClasses.Data Imports BaseClasses.Utils.StringUtils Namespace Persons.UI ' Typical customizations that may be done in this class include ' - adding custom event handlers ' - overriding base class methods ''' ''' The superclass (i.e. base class) for all Designer-generated user controls in this application. ''' ''' ''' ''' ''' Public Class BaseApplicationUserControl Inherits BaseClasses.Web.UI.BaseUserControl ' Variable used to prevent infinite loop Private _modifyRedirectUrlInProgress As Boolean = False ''' Allow for migration from earlier versions which did not have url encryption. Public Overridable Function ModifyRedirectUrl(ByVal redirectUrl As String, ByVal redirectArgument As String) As String Return EvaluateExpressions(redirectUrl, redirectArgument, False) End Function Public Overridable Function ModifyRedirectUrl(ByVal redirectUrl As String, ByVal redirectArgument As String, ByVal bEncrypt As Boolean) As String Return EvaluateExpressions(redirectUrl, redirectArgument, bEncrypt) End Function Public Overridable Function EvaluateExpressions(ByVal redirectUrl As String, ByVal redirectArgument As String, ByVal bEncrypt As Boolean) As String Const PREFIX_NO_ENCODE As String = "NoUrlEncode:" If (_modifyRedirectUrlInProgress) Then Return Nothing Else _modifyRedirectUrlInProgress = True End If Dim finalRedirectUrl As String = redirectUrl Dim finalRedirectArgument As String = redirectArgument If (finalRedirectUrl Is Nothing OrElse finalRedirectUrl.Trim = "") Then Return "" ElseIf (finalRedirectUrl.IndexOf("{"c) < 0) Then 'RedirectUrl does not contain any format specifiers _modifyRedirectUrlInProgress = False Return finalRedirectUrl Else 'The old way was to pass separate URL and arguments and use String.Format to 'do the replacement. Example: ' URL: EditProductsRecord?Products={0} ' Argument: PK 'The new way to is pass the arguments directly in the URL. Example: ' URL: EditProductsRecord?Products={PK} 'If the old way is passsed, convert it to the new way. If (Len(redirectArgument) > 0) Then Dim arguments() As String = Split(redirectArgument, ",") Dim i As Integer For i = 0 To (arguments.Length - 1) finalRedirectUrl = finalRedirectUrl.Replace("{" & i.ToString & "}", "{" & arguments(i) & "}") Next finalRedirectArgument = "" End If 'First find all the table and record controls in the page. Dim controlList As ArrayList = GetAllRecordAndTableControls() If controlList.Count = 0 Then Return finalRedirectUrl End If ' Store the controls in a hashtable using the control unique name ' as the key for easy refrence later in the function. Dim controlIdList As New Hashtable Dim control As System.Web.UI.Control Dim found As Boolean = False For Each control In controlList Dim uID As String = control.UniqueID Dim pageContentIndex As Integer = uID.IndexOf("$PageContent$") If pageContentIndex > 0 Then If found = False Then 'Remove all controls without $PageContent$ prefix, because this page is used with Master Page 'and these entries are irrelevant controlIdList.Clear() End If found = True End If If found Then 'If we found that Master Page is used for this page construction than disregard all controls 'without $PageContent$ prefix If pageContentIndex > 0 Then uID = uID.Substring(pageContentIndex + "$PageContent$".Length) controlIdList.Add(uID, control) End If Else 'No Master Page presense found so far controlIdList.Add(uID, control) End If Next 'Look at all of the expressions in the URL and forward processing 'to the appropriate controls. 'Expressions can be of the form [ControlName:][NoUrlEncode:]Key[:Value] Dim forwardTo As New ArrayList Dim remainingUrl As String = finalRedirectUrl While (remainingUrl.IndexOf("{"c) >= 0) And (remainingUrl.IndexOf("}"c) > 0) And _ (remainingUrl.IndexOf("{"c) < remainingUrl.IndexOf("}"c)) Dim leftIndex As Integer = remainingUrl.IndexOf("{"c) Dim rightIndex As Integer = remainingUrl.IndexOf("}"c) Dim expression As String = remainingUrl.Substring(leftIndex + 1, rightIndex - leftIndex - 1) remainingUrl = remainingUrl.Substring(rightIndex + 1) Dim prefix As String = Nothing If (expression.IndexOf(":") > 0) Then prefix = expression.Substring(0, expression.IndexOf(":")) End If If (Not IsNothing(prefix)) AndAlso (prefix.Length > 0) AndAlso _ (Not (InvariantLCase(prefix) = InvariantLCase(PREFIX_NO_ENCODE))) AndAlso _ (Not BaseRecord.IsKnownExpressionPrefix(prefix)) Then 'The prefix is a control name. Add it to the list of controls that 'need to process the URL. If (controlIdList.Contains(prefix)) And (Not forwardTo.Contains(prefix)) Then forwardTo.Add(prefix) End If End If End While 'Forward the request to each control in the forwardTo list Dim containerId As String For Each containerId In forwardTo Dim ctl As Control = CType(controlIdList.Item(containerId), Control) If (Not IsNothing(ctl)) Then If TypeOf ctl Is BaseApplicationRecordControl Then finalRedirectUrl = DirectCast(ctl, BaseApplicationRecordControl).EvaluateExpressions(finalRedirectUrl, finalRedirectArgument, bEncrypt) ElseIf TypeOf ctl Is BaseApplicationTableControl Then finalRedirectUrl = DirectCast(ctl, BaseApplicationTableControl).EvaluateExpressions(finalRedirectUrl, finalRedirectArgument, bEncrypt) End If End If Next 'If there are any unresolved expressions, let the other naming containers 'have a crack at modifying the URL For Each control In controlList If (forwardTo.IndexOf(control.ID) < 0) Then If TypeOf control Is BaseApplicationRecordControl Then finalRedirectUrl = DirectCast(control, BaseApplicationRecordControl).EvaluateExpressions(finalRedirectUrl, finalRedirectArgument, bEncrypt) ElseIf TypeOf control Is BaseApplicationTableControl Then finalRedirectUrl = DirectCast(control, BaseApplicationTableControl).EvaluateExpressions(finalRedirectUrl, finalRedirectArgument, bEncrypt) End If End If Next End If _modifyRedirectUrlInProgress = False Return finalRedirectUrl End Function Private Function GetAllRecordAndTableControls() As ArrayList Dim controlList As ArrayList = New ArrayList() GetAllRecordAndTableControls(Me, controlList) Return controlList End Function Private Sub GetAllRecordAndTableControls(ByVal ctl As Control, ByVal controlList As ArrayList) If ctl Is Nothing Then Return End If If TypeOf ctl Is BaseApplicationRecordControl OrElse _ TypeOf ctl Is BaseApplicationTableControl Then controlList.Add(ctl) End If Dim nextCtl As Control For Each nextCtl In ctl.Controls() GetAllRecordAndTableControls(nextCtl, controlList) Next End Sub Public Function GetResourceValue(ByVal keyVal As String, ByVal appName As String) As String Try Dim resObj As Object = GetGlobalResourceObject(appName, keyVal) If Not resObj Is Nothing Then Return resObj.ToString() End If Return "" Catch Return "" End Try End Function Public Function GetResourceValue(ByVal keyVal As String) As String Try Dim appname As String = BaseClasses.Configuration.ApplicationSettings.Current.GetAppSetting(BaseClasses.Configuration.ApplicationSettings.ConfigurationKey.ApplicationName) Dim resObj As Object = GetGlobalResourceObject(appname, keyVal) If Not resObj Is Nothing Then Return resObj.ToString() End If Return "" Catch Return "" End Try End Function ''' ----------------------------------------------------------------------------- ''' ''' Register Control buttonCtrl with ScriptManager to perform traditional postback instead of default async postback ''' ''' ''' ''' ''' [sramarao] 3/2007 Created ''' ''' ----------------------------------------------------------------------------- Public Sub RegisterPostBackTrigger(ByVal buttonCtrl As System.Web.UI.Control, ByVal updatePanelCtrl As System.Web.UI.Control) Try ' Get current ScriptManager Dim scriptMgr As ScriptManager = ScriptManager.GetCurrent(Me.Page) ' If Scriptmanager not preset return. If scriptMgr Is Nothing Then Return End If ' If buttonCtrl is not surrounded by an UpdatePanel then return. Dim CurrentUpdatePanel As System.Web.UI.UpdatePanel = CType(updatePanelCtrl, UpdatePanel) If CurrentUpdatePanel Is Nothing Then Return End If If buttonCtrl Is Nothing Then Return End If scriptMgr.RegisterPostBackControl(buttonCtrl) Catch ex As Exception Throw ex End Try End Sub Public Sub RegisterPostBackTrigger(ByVal buttonCtrl As System.Web.UI.Control) Try ' Get current ScriptManager Dim scriptMgr As ScriptManager = ScriptManager.GetCurrent(Me.Page) ' If Scriptmanager not preset return. If scriptMgr Is Nothing Then Return End If If buttonCtrl Is Nothing Then Return End If scriptMgr.RegisterPostBackControl(buttonCtrl) Catch ex As Exception Throw ex End Try End Sub Public Overridable Sub SaveData() End Sub Public Overridable Sub SetChartControl(ByVal chartCtrlName As String) End Sub #Region " Methods to manage saving and retrieving control values to session. " Protected Sub Control_SaveControls_Unload(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Unload If DirectCast(Me.Page, BaseApplicationPage).ShouldSaveControlsToSession Then Me.SaveControlsToSession() End If End Sub Protected Overridable Sub SaveControlsToSession() End Sub Protected Sub Control_ClearControls_PreRender(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.PreRender Me.ClearControlsFromSession() End Sub Protected Overridable Sub ClearControlsFromSession() End Sub Public Sub SaveToSession( _ ByVal control As Control, _ ByVal value As String) SaveToSession(control.UniqueID, value) End Sub Public Function GetFromSession( _ ByVal control As Control, _ ByVal defaultValue As String) As String Return GetFromSession(control.UniqueID, defaultValue) End Function Public Function GetFromSession(ByVal control As Control) As String Return GetFromSession(control.UniqueID, Nothing) End Function Public Sub RemoveFromSession(ByVal control As Control) RemoveFromSession(control.UniqueID) End Sub Public Function InSession(ByVal control As Control) As Boolean Return InSession(control.UniqueID) End Function Public Sub SaveToSession( _ ByVal control As Control, _ ByVal variable As String, _ ByVal value As String) SaveToSession(control.UniqueID & variable, value) End Sub Public Function GetFromSession( _ ByVal control As Control, _ ByVal variable As String, _ ByVal defaultValue As String) As String Return GetFromSession(control.UniqueID & variable, defaultValue) End Function Public Sub RemoveFromSession( _ ByVal control As Control, _ ByVal variable As String) RemoveFromSession(control.UniqueID & variable) End Sub Public Function InSession( _ ByVal control As Control, _ ByVal variable As String) As Boolean Return InSession(control.UniqueID & variable) End Function Public Sub SaveToSession( _ ByVal name As String, _ ByVal value As String) Me.Page.Session()(GetValueKey(name)) = value End Sub Public Function GetFromSession( _ ByVal name As String, _ ByVal defaultValue As String) As String Dim value As String = CType(Me.Page.Session()(GetValueKey(name)), String) If value Is Nothing OrElse value.Trim() = "" Then value = defaultValue End If Return value End Function Public Function GetFromSession(ByVal name As String) As String Return GetFromSession(name, Nothing) End Function Public Sub RemoveFromSession(ByVal name As String) Me.Page.Session.Remove(GetValueKey(name)) End Sub Public Function InSession(ByVal name As String) As Boolean Return (Not Me.Page.Session(GetValueKey(name)) Is Nothing) End Function Public Function GetValueKey(ByVal name As String) As String Return Me.Page.Session.SessionID & Me.Page.AppRelativeVirtualPath & name End Function #End Region End Class End Namespace