DNN在Ajax上支持了很多,最著名的动作就是在模块定义上增加了Supports Partial Rendering,可以支持局部刷新。如果勾选了这个标志位,DNN就是把模块内容放在一个UpdatePanel中,这样就可以做到局部刷新。
近日在项目中有一个模块,设置了这个PartialRendering的标志位。兴奋之余,却发现模块中AddModuleMessage不起作用了,无论如何都不能显示错误信息。不断尝试后,发现去掉PartialRendering标志后,错误信息就可以显示了,百思不得其解,难道Ajax中就不能报错了吗?
不甘心啊,于是经过艰苦卓绝的斗争,终于在skin.vb中找到了答案。skin.vb中有一个方法:InjectModule()是加载模块的,一个模块的加载顺序是这样的:
现在的解决方案只能是修改skin.vb中的加载逻辑,将MessagePlaceHolder放到UpdatePanel里面。修改代码如下:
将412行的代码移到下面Ajax的代码块附近,并在Ajax判断时:
这个方案的问题就是需要修改DotNetNuke.dll,我重新编译了一个Dotnetnuke.dll(版本4.5.5.1),可以从 这儿下载。该版本仅供大家参考和测试,保证没有病毒和后门,但不负法律责任哦。
近日在项目中有一个模块,设置了这个PartialRendering的标志位。兴奋之余,却发现模块中AddModuleMessage不起作用了,无论如何都不能显示错误信息。不断尝试后,发现去掉PartialRendering标志后,错误信息就可以显示了,百思不得其解,难道Ajax中就不能报错了吗?
不甘心啊,于是经过艰苦卓绝的斗争,终于在skin.vb中找到了答案。skin.vb中有一个方法:InjectModule()是加载模块的,一个模块的加载顺序是这样的:
- 加载容器
- ……
- 加载MessagePlaceHolder,放到容器中。这个就是AddModuleMessage()放错误信息的地方
- 加载模块控件;
- 判断是否支持Ajax
- 如果是:生成UpdatePanel,并将模块控件放到UpdatePanel,然后将UpdatePanel放入容器
- 如果不支持,直接将模块控件放到容器中
现在的解决方案只能是修改skin.vb中的加载逻辑,将MessagePlaceHolder放到UpdatePanel里面。修改代码如下:
将412行的代码移到下面Ajax的代码块附近,并在Ajax判断时:
- 如果支持Ajax,先将MessagePlaceHolder放到UpdatePanel,再放模块控件
- 否则,先将MessagePlaceHolder放到容器,再放模块控件
'
inject a message placeholder for common module messaging - UI.Skins.Skin.AddModuleMessage
Dim MessagePlaceholder As New PlaceHolder
MessagePlaceholder.ID = "MessagePlaceHolder"
MessagePlaceholder.Visible = True
' module user control processing
If Not objPortalModuleBase Is Nothing Then
' if module is dynamically loaded and AJAX is installed and the control supports partial rendering (defined in ModuleControls table )
If blnDynamic = True AndAlso objModule.SupportsPartialRendering = True AndAlso AJAX.IsInstalled = True Then
' register AJAX
AJAX.RegisterScriptManager()
' enable Partial Rendering
AJAX.SetScriptManagerProperty( Me .Page, " EnablePartialRendering " , New Object () { True })
' create update panel
Dim objUpdatePanel As Control = AJAX.CreateUpdatePanelControl
objUpdatePanel.ID = objPortalModuleBase.ID & " _UP "
' get update panel content template
Dim objContentTemplateContainer As Control = AJAX.ContentTemplateContainerControl(objUpdatePanel)
'Inject message place holder in update panel
objContentTemplateContainer.Controls.Add(MessagePlaceholder)
' inject module into update panel content template
objContentTemplateContainer.Controls.Add(objPortalModuleBase)
' inject the update panel into the panel
objPanel.Controls.Add(objUpdatePanel)
' 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
' inject updateprogress into the panel
objPanel.Controls.Add(AJAX.CreateUpdateProgressControl(objUpdatePanel.ID, objImage))
Else
objPanel.Controls.Add(MessagePlaceholder)
' inject the module into the panel
objPanel.Controls.Add(objPortalModuleBase)
End If
End If
Dim MessagePlaceholder As New PlaceHolder
MessagePlaceholder.ID = "MessagePlaceHolder"
MessagePlaceholder.Visible = True
' module user control processing
If Not objPortalModuleBase Is Nothing Then
' if module is dynamically loaded and AJAX is installed and the control supports partial rendering (defined in ModuleControls table )
If blnDynamic = True AndAlso objModule.SupportsPartialRendering = True AndAlso AJAX.IsInstalled = True Then
' register AJAX
AJAX.RegisterScriptManager()
' enable Partial Rendering
AJAX.SetScriptManagerProperty( Me .Page, " EnablePartialRendering " , New Object () { True })
' create update panel
Dim objUpdatePanel As Control = AJAX.CreateUpdatePanelControl
objUpdatePanel.ID = objPortalModuleBase.ID & " _UP "
' get update panel content template
Dim objContentTemplateContainer As Control = AJAX.ContentTemplateContainerControl(objUpdatePanel)
'Inject message place holder in update panel
objContentTemplateContainer.Controls.Add(MessagePlaceholder)
' inject module into update panel content template
objContentTemplateContainer.Controls.Add(objPortalModuleBase)
' inject the update panel into the panel
objPanel.Controls.Add(objUpdatePanel)
' 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
' inject updateprogress into the panel
objPanel.Controls.Add(AJAX.CreateUpdateProgressControl(objUpdatePanel.ID, objImage))
Else
objPanel.Controls.Add(MessagePlaceholder)
' inject the module into the panel
objPanel.Controls.Add(objPortalModuleBase)
End If
End If
这个方案的问题就是需要修改DotNetNuke.dll,我重新编译了一个Dotnetnuke.dll(版本4.5.5.1),可以从 这儿下载。该版本仅供大家参考和测试,保证没有病毒和后门,但不负法律责任哦。