Dotnetnuke的AJAX问题

 DNN在Ajax上支持了很多,最著名的动作就是在模块定义上增加了Supports Partial Rendering,可以支持局部刷新。如果勾选了这个标志位,DNN就是把模块内容放在一个UpdatePanel中,这样就可以做到局部刷新。

近日在项目中有一个模块,设置了这个PartialRendering的标志位。兴奋之余,却发现模块中AddModuleMessage不起作用了,无论如何都不能显示错误信息。不断尝试后,发现去掉PartialRendering标志后,错误信息就可以显示了,百思不得其解,难道Ajax中就不能报错了吗?

不甘心啊,于是经过艰苦卓绝的斗争,终于在skin.vb中找到了答案。skin.vb中有一个方法:InjectModule()是加载模块的,一个模块的加载顺序是这样的:
  1. 加载容器
  2. ……
  3. 加载MessagePlaceHolder,放到容器中。这个就是AddModuleMessage()放错误信息的地方
  4. 加载模块控件;
  5. 判断是否支持Ajax
    • 如果是:生成UpdatePanel,并将模块控件放到UpdatePanel,然后将UpdatePanel放入容器
    • 如果不支持,直接将模块控件放到容器中
从上面逻辑可以看出MessagePlaceHolder是在UpdatePanel外面的,所以无论模块控件如何调用AddMessage,也不会显示。因为现在是局部刷新,只能刷新UpdatePanel里面的东西,而不会刷新外面的MessagePlaceHolder.

现在的解决方案只能是修改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

这个方案的问题就是需要修改DotNetNuke.dll,我重新编译了一个Dotnetnuke.dll(版本4.5.5.1),可以从 这儿下载。该版本仅供大家参考和测试,保证没有病毒和后门,但不负法律责任哦。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值