【问题标题】:DNN: Using multiple web user controls in one module and showing different controls in different pagesDNN:在一个模块中使用多个 Web 用户控件,并在不同页面中显示不同的控件
【发布时间】:2013-09-15 11:41:13
【问题描述】:

我是 DotNetNuke 新手。请温柔一点。我正在使用“DotNetNuke 6 Compiled Module”模板来构建我的模块。我已经在项目中有 View.ascx 控件,并添加了另一个名为 test.ascx 的控件。

我的问题是:如何在添加模块的不同页面中显示不同的不同视图。 (如果可能的话) 例如 在说 default.aspx 页面上显示 View.ascx 然后在 default2.aspx 页面上显示 test.ascx 用户控件?

如果这不可能,是否意味着我需要为每个 ascx 控件使用不同的 Visual Studio 项目。肯定不是。

【问题讨论】:

    标签: c# webforms dotnetnuke dotnetnuke-module


    【解决方案1】:

    天文,

    选项 1:

    您需要转到主机 > 扩展 > 编辑您的扩展 > 展开模块定义,然后单击添加控件。

    在这里您必须选择您的 ascx 控件并提供任何字符串形式的键。假设您提供了密钥test,您选择了用户控件并选择了控件类型为view 并保存了它。

    现在从视图中您可以使用以下代码导航到新添加的控件: DotNetNuke.Common.Globals.NavigateUrl(TabId,"test","mid="+ModuleID);

    这将重定向页面并使用 test.ascx 加载您的页面。

    当您想默认显示 view.ascx 并希望在执行某些操作时切换视图并显示 test.ascx 时,可以使用这种选项。这里的缺点是,当你切换到 test.ascx 时,添加到页面的所有其他模块都将不可见。

    选项 2:

    您必须在模块中创建一个新定义。为此,请转到主机 > 扩展 > 编辑您的模块 > 展开模块定义 > 单击添加并添加新定义。添加定义后,您可以将 test.ascx 和视图控件添加到定义中,无需任何键。

    完成上述操作后,如果您再次删除模块并将其添加到页面,它将显示页面中添加的两个模块。这是两个定义。查看博客模块定义,了解多个定义的工作原理。

    当您想从同一个模块同时显示多个视图控件时使用此选项。

    我希望这会有所帮助。如果您还有其他问题,请告诉我。

    【讨论】:

    • 谢谢普拉尚特。选项 1 看起来不错。我会进一步调查。
    • 您好 Prashant,我正在尝试遵循选项 1 我不知道应该在 TabId 和 ModuleID 中传递什么。有人可以建议吗?
    • @NanjiMange、TabId 和 ModuleId 可从您正在构建的模块的基类中获得。因此,它将只是将这两个属性放在原处。您使用的是哪个 dnn 版本?
    【解决方案2】:

    在这里聚会有点晚了,但如果我理解正确的话,你想要一个具有不同视图的模块。为了补充 Prashant 的方法,这里有两个我经常使用的选项;

    1.) 多视图

    <asp:MultiView ID="myMView" runat="server" ActiveViewIndex="0">
        <asp:View ID="ViewOne" runat="server">
    
          ...Content 1 here...
    
        </asp:View>
        <asp:View ID="ViewTwo" runat="server">
    
          ...Content 2 here...
    
        </asp:View>  
    </asp:MultiView>
    

    在后面的代码中,您可以根据某些条件设置活动视图

    if(someCondition)
      myMView.ActiveViewIndex = 0;
    else
      myMView.ActiveViewIndex = 1;
    

    2.)占位符。这是我最喜欢的,因为它允许我在自己的控件中分离每个视图及其代码。您只需向 DNN 注册一个控件(主控件)。您可以拥有 10、100、1000 个子控件,它们不需要向 DNN 注册,因为它们将包含在 MasterControl.ascx 占位符中。 在 MasterControl.ascx 中,添加

    <asp:PlaceHolder ID="myPholder"  runat="server"></asp:PlaceHolder>
    

    按照 Prashant 在方法 1 中的说明,将 MasterControl 注册到 DNN。在后面的代码中,添加以下内容,

    string childControl;
    switch (condition)
    {
        case "condition1":
            childControl = ControlPath + Child1.ascx";
            break;
        case "condition2":
            childControl = ControlPath + Child2.ascx";
            break;      
        ...more conditions...
    }
    PortalModuleBase objModule = (PortalModuleBase)this.LoadControl(childControl);
    if ((objModule != null))
    {
        myPholder.Controls.Clear();
        objModule.ModuleConfiguration = this.ModuleConfiguration;
        myPholder.Controls.Add(objModule);
    }
    

    只是一种不同的做事方式。祝你好运。

    【讨论】:

    • 在 PlaceHolder 方法中,childs.ascx 和 childs.ascx.cs 应该是什么样子?我可以在启动项目后创建它们,还是必须提前考虑我需要什么和需要多少?
    • @Ehsan,child.ascx 是一个常规的 DNN 用户控件。他们没有什么特别的。是的,即使在模块创建/注册之后,您也可以随时添加它们。它们不必向 DNN 注册,只需存在于指定的文件路径中即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多