【问题标题】:How to use Skin.AddPageMessage() method?如何使用 Skin.AddPageMes​​sage() 方法?
【发布时间】:2012-03-08 19:53:53
【问题描述】:

我正在开发一个 DNN 模块,我想在我的 ContentPane 顶部显示一条信息消息,而不是在实际模块上方。我发现DotNetNuke.UI.Skins.Skin.AddPageMessage() 应该这样做。我没有得到我想要的行为,消息根本不会显示。

这个方法的重载很少,一组接受Page 对象,另一组接受Skin 对象。

public static void AddPageMessage(Page page, string heading, string message, ModuleMessage.ModuleMessageType moduleMessageType)

public static void AddPageMessage(Skin skin, string heading, string message, ModuleMessage.ModuleMessageType moduleMessageType)

我确实查看了 DNN 源代码,发现最后他们实际上使用了相同的 private static AddPageMessage(...) 方法,它只是在提供的控件中查找 ContentPane 并将新的 ModuleMessage 添加到其控件的集合。

我应该将什么作为 PageSkin 参数传递以使此正确工作?

谢谢...

【问题讨论】:

    标签: c# dotnetnuke dotnetnuke-module


    【解决方案1】:

    私有 AddPageMes​​sage 方法将一个相当模糊的“Control”作为第一个参数。我认为这需要是当前的皮肤,因为它是 ContentPane 的 FindControl。

    做这样的事情应该让你参考当前的皮肤:

    var skin = Skin.GetSkin((PageBase)this.Page);
    Skin.AddPageMessage(skin, "Header", "Message", ModuleMessageType.GreenSuccess);
    

    【讨论】:

    • 感谢您的回复,我已经尝试过您之前描述的方式,但不幸的是它似乎不起作用。我已经尝试过使用默认和自定义皮肤。在调试 dnn 源时,FindControl 实际上找到了 ContentPane,但它的 Controls 集合是空的(不应该是,因为至少应该有我的模块)并且在向集合中添加新的 ModuleMessage 对象后没有任何反应,也没有消息显示在页面上。有什么想法吗?
    • 嗯,我也看到了同样的情况。奇怪的。我不完全确定为什么会发生这种情况。
    • 更多证据...该方法适用于添加“DNN Pro Trial”消息。但是当我自己调用它时,它并没有出现在 UI 中,即使它找到了 ContentPane...
    【解决方案2】:

    消息没有显示的原因是你在modulecontrols的controlssetting中打开了“启用部分渲染”。

    如果您使用 AJAX(如果您将部分渲染设置为 true,则会发生这种情况)DNN 模块消息会从 DNN 本身关闭。

    如果您只在页面上的 1 个控件上启用了部分呈现(不必是您从中执行操作的控件),这就足够了。 DNN 会将整个页面包装到 ajax 脚本管理器中,并且消息不再起作用。

    *编辑 26.04.2012 10:45:

    您可以通过在 Page_Load() 中执行以下代码来获取当前的 ScriptManager。如果 manager 为 null,则您没有启用 ajax,并且 modulemessages 应该可以工作。如果 bIsAjaxEnabled 为 true,则模块消息被禁用。

    ScriptManager manager = AJAX.GetScriptManager(Page);
    if (manager != null)
    {
       bool bIsAjaxEnabled = manager.SupportsPartialRendering;
    }
    

    【讨论】:

    • 如何确定页面是由 ajax 脚本管理器包装的?我只有一个带有一个模块的简单页面,没有启用部分渲染的模块控件,似乎没有 ajax 脚本管理器(检查页面源)但页面消息仍然没有显示。有什么线索吗?
    • 我一直在玩它,但仍然没有成功 :( 在检查 SupportsPartialRendering 之后,确实是真的......我也做了的是我查看了 DNN 源并发现了ScriptManager 被添加到每个页面(作为 DotNetNuke.Framework.PageBase.OnInit() 方法中的方法调用,其中 ScriptManager 被添加到每个页面)。我忽略了什么吗?
    • 是的,脚本管理器正在添加到每个页面。但是,如果您启用“SupportPartialRendering”DNN(版本 6)将用 Telerik ajaxScriptmanager 替换 ScriptManager。从那里启用 AJAX,这意味着模块消息不再工作。只需尝试在新创建的页面上创建一个完全空的控件。将一个按钮放置到模块上,如果您单击该模块,则会显示一个模块消息。通常它应该可以工作。
    • 好吧,我执行了 DNN 新实例的全新安装,创建了一个简单模块(通过使用 christoctemplate.codeplex.com 模板),它在 View.ascx 中检查 Page_Load 处的 scriptmanager 并尝试显示页面消息在 testButton_OnClick 中。我从 AJAX.GetScriptManager() 获得的脚本管理器不为空,并且属于 Telerik.Web.UI.RadScriptManager 类型。 SupportsPartialRendering 为真。所有控件(查看、编辑、设置)都关闭了部分渲染。有什么想法吗?
    • 嗯,第一眼你的模块模板看起来非常干净和漂亮。第一次拍摄我找不到任何问题。我所有的经验都来自 DNN5 处理有关 ajax 的模块消息。如果他们在 DNN6 中进行了重大更改,那么问题可能出在其他问题上。我会在周末仔细研究这个问题,如果我能找到一些东西,请告诉你。您使用的是哪个版本的 DNN?
    猜你喜欢
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多