sys.invalidoperationexception:控件已与元素关联。在DotNetNuke中使用Telerik Controls

时间:2011-10-17 02:41:11

标签: ajax dotnetnuke telerik-grid

sys.invalidoperationexception:控件已与元素关联。我使用的是DotNetNuke 5.6.3。如果我点击编辑就会发生错误。我知道它与AJAX和脚本管理器有关,但我无法让它在DotNetNeukt中没有这个错误的情况下运行。

这是我的代码:

<%@ 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>

1 个答案:

答案 0 :(得分:1)

好的,这是解决方案。我需要替换默认的脚本管理器。在DotNetNuke.Library项目的DNN核心5.6.3中,我对AJAX.VB进行了以下更改:

第46行:

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

整个文件现在看起来像这样,一旦我完成编辑,我重新编译并将我的新dll添加到我的项目中:

'
' 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