Search code examples
ajaxdotnetnuketelerik-grid

sys.invalidoperationexception: A control is already associated with the element. using Telerik Controls In DotNetNuke


sys.invalidoperationexception: A control is already associated with the element. I am using DotNetNuke 5.6.3. The rror occurs if I click edit. I know it has something to do with AJAX, and the script manager, but I just cannot get it to function without this error in DotNetNeukt.

Here is my code:

<%@ Control language="C#" Inherits="my.Modules.ImageRotator.EditImageRotator" CodeFile="EditImageRotator.ascx.cs" AutoEventWireup="true"%>
<%@ Register TagPrefix="dnn" TagName="Label" Src="~/controls/LabelControl.ascx" %>
<%@ Register TagPrefix="dnn" TagName="TextEditor" Src="~/controls/TextEditor.ascx" %>
<%@ Register TagPrefix="dnn" TagName="Audit" Src="~/controls/ModuleAuditControl.ascx" %>
<%@ Register TagPrefix="telerik" Namespace="Telerik.Web.UI" Assembly="Telerik.Web.UI" %>



<ContentTemplate>
    <telerik:RadGrid ID="RadGrid1" runat="server" AllowPaging="True" 
      AllowSorting="True" AutoGenerateDeleteColumn="True" 
      AutoGenerateEditColumn="True" CausesValidation="False" CellSpacing="0" 
      DataSourceID="SqlDataSource1" GridLines="None" RegisterWithScriptManager="true" 
      Skin="WebBlue">
      <ClientSettings AllowColumnsReorder="True" ReorderColumnsOnClient="True">
        <Selecting AllowRowSelect="True" />
      </ClientSettings>
      <MasterTableView AutoGenerateColumns="False" DataKeyNames="ItemID" 
        DataSourceID="SqlDataSource1">
        <CommandItemSettings ExportToPdfText="Export to PDF" />
        <RowIndicatorColumn FilterControlAltText="Filter RowIndicator column">
        </RowIndicatorColumn>
        <ExpandCollapseColumn FilterControlAltText="Filter ExpandColumn column">
        </ExpandCollapseColumn>
        <Columns>
          <telerik:GridBoundColumn DataField="ModuleID" DataType="System.Int32" 
            FilterControlAltText="Filter ModuleID column" HeaderText="ModuleID" 
            SortExpression="ModuleID" UniqueName="ModuleID">
          </telerik:GridBoundColumn>
          <telerik:GridBoundColumn DataField="ItemID" DataType="System.Int32" 
            FilterControlAltText="Filter ItemID column" HeaderText="ItemID" ReadOnly="True" 
            SortExpression="ItemID" UniqueName="ItemID">
          </telerik:GridBoundColumn>
          <telerik:GridBoundColumn DataField="Content" 
            FilterControlAltText="Filter Content column" HeaderText="Content" 
            SortExpression="Content" UniqueName="Content">
          </telerik:GridBoundColumn>
          <telerik:GridBoundColumn DataField="CreatedByUser" DataType="System.Int32" 
            FilterControlAltText="Filter CreatedByUser column" HeaderText="CreatedByUser" 
            SortExpression="CreatedByUser" UniqueName="CreatedByUser">
          </telerik:GridBoundColumn>
          <telerik:GridBoundColumn DataField="CreatedDate" DataType="System.DateTime" 
            FilterControlAltText="Filter CreatedDate column" HeaderText="CreatedDate" 
            SortExpression="CreatedDate" UniqueName="CreatedDate">
          </telerik:GridBoundColumn>
          <telerik:GridBoundColumn DataField="Link" 
            FilterControlAltText="Filter Link column" HeaderText="Link" 
            SortExpression="Link" UniqueName="Link">
          </telerik:GridBoundColumn>
          <telerik:GridBoundColumn DataField="SortOrder" DataType="System.Int32" 
            FilterControlAltText="Filter SortOrder column" HeaderText="SortOrder" 
            SortExpression="SortOrder" UniqueName="SortOrder">
          </telerik:GridBoundColumn>
        </Columns>
        <EditFormSettings>
          <EditColumn FilterControlAltText="Filter EditCommandColumn column">
          </EditColumn>
        </EditFormSettings>
      </MasterTableView>
      <FilterMenu EnableImageSprites="False">
      </FilterMenu>
      <HeaderContextMenu CssClass="GridContextMenu GridContextMenu_Default">
      </HeaderContextMenu>
    </telerik:RadGrid>
     </ContentTemplate>
     <br />
      <asp:linkbutton cssclass="CommandButton" id="cmdUpdate" OnClick="cmdUpdate_Click" resourcekey="cmdUpdate" runat="server" borderstyle="none" text="Update" CausesValidation="False"></asp:linkbutton>&nbsp;
    <asp:linkbutton cssclass="CommandButton" id="cmdCancel" OnClick="cmdCancel_Click" resourcekey="cmdCancel" runat="server" borderstyle="none" text="Cancel" causesvalidation="False"></asp:linkbutton>&nbsp;
    <asp:linkbutton cssclass="CommandButton" id="cmdDelete" OnClick="cmdDelete_Click" resourcekey="cmdDelete" runat="server" borderstyle="none" text="Delete" causesvalidation="False"></asp:linkbutton>&nbsp;
</div>

    <dnn:audit id="ctlAudit" runat="server" />

    <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
           ConnectionString="<%$ ConnectionStrings:ImageRotatorConnectionString %>" 
           SelectCommand="SELECT * FROM [ImageRotator]"></asp:SqlDataSource>

Solution

  • OK, here is the solution. I needed to replace the default script manager. In the DNN core 5.6.3 in the DotNetNuke.Library projet, I made the following change to AJAX.VB :

    at line 46:

    Using objScriptManager As Telerik.Web.UI.RadScriptManager = New Telerik.Web.UI.RadScriptManager() With {.ID = "ScriptManager", .EnableScriptGlobalization = True}
    

    The whole file now looks like this, once I completed the edit I recompiled and added my new dll to my project:

    '
    ' DotNetNuke® - http://www.dotnetnuke.com
    ' Copyright (c) 2002-2010
    ' by DotNetNuke Corporation
    '
    ' Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated 
    ' documentation files (the "Software"), to deal in the Software without restriction, including without limitation 
    ' the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and 
    ' to permit persons to whom the Software is furnished to do so, subject to the following conditions:
    '
    ' The above copyright notice and this permission notice shall be included in all copies or substantial portions 
    ' of the Software.
    '
    ' THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 
    ' TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
    ' THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 
    ' CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
    ' DEALINGS IN THE SOFTWARE.
    '
    
    Imports System.Web.Compilation
    Imports System.Reflection
    Imports System.Xml
    Imports System.Xml.XPath
    Imports DotNetNuke.Entities.Host
    
    Namespace DotNetNuke.Framework
    
        Public Class AJAX
    
    #Region "Public Methods"
    
            ''' -----------------------------------------------------------------------------
            ''' <summary>
            ''' AddScriptManager is used internally by the framework to add a ScriptManager control to the page
            ''' </summary>
            ''' <remarks>
            ''' </remarks>
            ''' <history>
            ''' </history>
            ''' -----------------------------------------------------------------------------
            Public Shared Sub AddScriptManager(ByVal objPage As Page)
                If GetScriptManager(objPage) Is Nothing Then
            Using objScriptManager As Telerik.Web.UI.RadScriptManager = New Telerik.Web.UI.RadScriptManager() With {.ID = "ScriptManager", .EnableScriptGlobalization = True}
              If objPage.Form IsNot Nothing Then
                Try
                  objPage.Form.Controls.AddAt(0, objScriptManager)
                Catch ex As HttpException
                  'suppress error adding script manager to support edge-case of module developers custom aspx pages that inherit from basepage and use code blocks
                End Try
                If HttpContext.Current.Items("System.Web.UI.ScriptManager") Is Nothing Then
                  HttpContext.Current.Items.Add("System.Web.UI.ScriptManager", True)
                End If
              End If
            End Using
                End If
            End Sub
    
            Public Shared Function GetScriptManager(ByVal objPage As Page) As ScriptManager
                Return TryCast(objPage.FindControl("ScriptManager"), ScriptManager)
            End Function
    
            ''' -----------------------------------------------------------------------------
            ''' <summary>
            ''' IsEnabled can be used to determine if AJAX has been enabled already as we
            ''' only need one Script Manager per page.
            ''' </summary>
            ''' <remarks>
            ''' </remarks>
            ''' <history>
            ''' </history>
            ''' -----------------------------------------------------------------------------
            Public Shared Function IsEnabled() As Boolean
                If HttpContext.Current.Items("System.Web.UI.ScriptManager") Is Nothing Then
                    Return False
                Else
                    Return CType(HttpContext.Current.Items("System.Web.UI.ScriptManager"), Boolean)
                End If
            End Function
    
            ''' -----------------------------------------------------------------------------
            ''' <summary>
            ''' IsInstalled can be used to determine if AJAX is installed on the server
            ''' </summary>
            ''' <remarks>
            ''' </remarks>
            ''' <history>
            ''' </history>
            ''' -----------------------------------------------------------------------------
            Public Shared Function IsInstalled() As Boolean
                Return True
            End Function
    
            ''' -----------------------------------------------------------------------------
            ''' <summary>
            ''' Allows a control to be excluded from UpdatePanel async callback
            ''' </summary>
            ''' <remarks>
            ''' </remarks>
            ''' <history>
            ''' </history>
            ''' -----------------------------------------------------------------------------
            Public Shared Sub RegisterPostBackControl(ByVal objControl As Control)
                Dim objScriptManager As ScriptManager = GetScriptManager(objControl.Page)
                If objScriptManager IsNot Nothing Then
                    objScriptManager.RegisterPostBackControl(objControl)
                End If
            End Sub
    
            ''' -----------------------------------------------------------------------------
            ''' <summary>
            ''' RegisterScriptManager must be used by developers to instruct the framework that AJAX is required on the page
            ''' </summary>
            ''' <remarks>
            ''' </remarks>
            ''' <history>
            ''' </history>
            ''' -----------------------------------------------------------------------------
            Public Shared Sub RegisterScriptManager()
                If Not IsEnabled() Then
                    HttpContext.Current.Items.Add("System.Web.UI.ScriptManager", True)
                End If
            End Sub
    
            ''' -----------------------------------------------------------------------------
            ''' <summary>
            ''' RemoveScriptManager will remove the ScriptManager control during Page Render if the RegisterScriptManager has not been called
            ''' </summary>
            ''' <remarks>
            ''' </remarks>
            ''' <history>
            ''' </history>
            ''' -----------------------------------------------------------------------------
            Public Shared Sub RemoveScriptManager(ByVal objPage As Page)
                If IsEnabled() = False Then
                    Dim objControl As Control = objPage.FindControl("ScriptManager")
                    If Not objControl Is Nothing Then
                        objPage.Form.Controls.Remove(objControl)
                    End If
                End If
            End Sub
    
            ''' -----------------------------------------------------------------------------
            ''' <summary>
            ''' Wraps a control in an update panel
            ''' </summary>
            ''' <remarks>
            ''' </remarks>
            ''' <history>
            ''' </history>
            ''' -----------------------------------------------------------------------------
            Public Shared Function WrapUpdatePanelControl(ByVal objControl As Control, ByVal blnIncludeProgress As Boolean) As Control
                Dim updatePanel As New UpdatePanel()
                updatePanel.ID = objControl.ID & "_UP"
                updatePanel.UpdateMode = UpdatePanelUpdateMode.Conditional
    
                Dim objContentTemplateContainer As Control = updatePanel.ContentTemplateContainer
    
                For i As Integer = 0 To objControl.Parent.Controls.Count - 1    'find offset of original control
                    If objControl.Parent.Controls(i).ID = objControl.ID Then    'if ID matches
                        objControl.Parent.Controls.AddAt(i, updatePanel)       'insert update panel in that position
                        objContentTemplateContainer.Controls.Add(objControl)    'inject passed in control into update panel
                        Exit For
                    End If
                Next
    
                If blnIncludeProgress Then
                    'create image for update progress control
                    Dim objImage As System.Web.UI.WebControls.Image = New System.Web.UI.WebControls.Image()
                    objImage.ImageUrl = "~/images/progressbar.gif"  'hardcoded
                    objImage.AlternateText = "ProgressBar"
    
                    Dim updateProgress As New UpdateProgress
                    updateProgress.AssociatedUpdatePanelID = updatePanel.ID
                    updateProgress.ID = updatePanel.ID + "_Prog"
                    updateProgress.ProgressTemplate = New UI.WebControls.LiteralTemplate(objImage)
    
                    objContentTemplateContainer.Controls.Add(updateProgress)
                End If
    
                Return updatePanel
            End Function
    
    #End Region
    
    #Region "Obsolete Methods"
    
            <Obsolete("Deprecated in DNN 5.4, Developers can work directly with the UpdatePanel")> _
            Public Shared Function ContentTemplateContainerControl(ByVal objUpdatePanel As Object) As Control
                Return TryCast(objUpdatePanel, UpdatePanel).ContentTemplateContainer
            End Function
    
            <Obsolete("Deprecated in DNN 5.4, MS AJax is now required for DotNetNuke 5.0.  Develoers can create the control directly")> _
            Public Shared Function CreateUpdatePanelControl() As Control
                Dim updatePanel As New UpdatePanel()
                updatePanel.UpdateMode = UpdatePanelUpdateMode.Conditional
                Return updatePanel
            End Function
    
            <Obsolete("Deprecated in DNN 5.4, MS AJax is now required for DotNetNuke 5.0. Developers can work directly with the UpdateProgress")> _
            Public Shared Function CreateUpdateProgressControl(ByVal AssociatedUpdatePanelID As String) As Control
                Dim updateProgress As New UpdateProgress
                updateProgress.ID = AssociatedUpdatePanelID + "_Prog"
                updateProgress.AssociatedUpdatePanelID = AssociatedUpdatePanelID
                Return updateProgress
            End Function
    
            <Obsolete("Deprecated in DNN 5.4, MS AJax is now required for DotNetNuke 5.0. Developers can work directly with the UpdateProgress")> _
            Public Shared Function CreateUpdateProgressControl(ByVal AssociatedUpdatePanelID As String, ByVal ProgressHTML As String) As Control
                Dim updateProgress As New UpdateProgress
                updateProgress.ID = AssociatedUpdatePanelID + "_Prog"
                updateProgress.AssociatedUpdatePanelID = AssociatedUpdatePanelID
                updateProgress.ProgressTemplate = New UI.WebControls.LiteralTemplate(ProgressHTML)
                Return updateProgress
            End Function
    
            <Obsolete("Deprecated in DNN 5.4, MS AJax is now required for DotNetNuke 5.0. Developers can work directly with the UpdateProgress")> _
            Public Shared Function CreateUpdateProgressControl(ByVal AssociatedUpdatePanelID As String, ByVal ProgressControl As Control) As Control
                Dim updateProgress As New UpdateProgress
                updateProgress.ID = AssociatedUpdatePanelID + "_Prog"
                updateProgress.AssociatedUpdatePanelID = AssociatedUpdatePanelID
                updateProgress.ProgressTemplate = New UI.WebControls.LiteralTemplate(ProgressControl)
                Return updateProgress
            End Function
    
            <Obsolete("Deprecated in DNN 5.0, MS AJax is now required for DotNetNuke 5.0 and above - value no longer read from Host.EnableAjax")> _
            Public Shared Function IsHostEnabled() As Boolean
                Return True
            End Function
    
            <Obsolete("Deprecated in DNN 5.4, Replaced by GetScriptManager")> _
            Public Shared Function ScriptManagerControl(ByVal objPage As Page) As Control
                Return objPage.FindControl("ScriptManager")
            End Function
    
            <Obsolete("Deprecated in DNN 5.4, Developers can work directly with the ScriptManager")> _
            Public Shared Sub SetScriptManagerProperty(ByVal objPage As Page, ByVal PropertyName As String, ByVal Args() As Object)
                Dim scriptManager As ScriptManager = GetScriptManager(objPage)
                If scriptManager IsNot Nothing Then
                    Reflection.SetProperty(scriptManager.GetType(), PropertyName, scriptManager, Args)
                End If
            End Sub
    
    #End Region
    
        End Class
    End Namespace