DNN:在一个模块中使用多个Web用户控件,并在不同页面中显示不同的控件

ast*_*boy 8 c# dotnetnuke webforms dotnetnuke-module

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

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

如果这不可能,这意味着我需要为每个ascx控件提供不同的visual studio项目.当然不是.

Pra*_*ani 13

天文,

选项1:

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

在这里,你必须选择你的ascx控件并提供任何字符串的键.假设您提供了密钥test,您选择了用户控件并选择了控制类型view并将其保存.

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

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

如果要在默认情况下显示view.ascx并希望在某些操作时切换视图并显示test.ascx,则可以使用此类选项.这里的缺点是,当您切换到test.ascx时,添加到页面的所有其他模块将不可见.

选项2:

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

完成上述操作后,如果删除并再次将模块添加到页面,则会在页面中显示两个模块.这是两个定义.查看博客模块定义,例如多个定义的工作原理.

如果要从同一模块同时显示多个视图控件,则使用此选项.

我希望这有帮助.如果您还有其他问题,请与我们联系.


Mos*_*hua 10

这里的派对有点晚了,但如果我理解正确,你想拥有一个具有不同观点的模块.要添加到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>
Run Code Online (Sandbox Code Playgroud)

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

if(someCondition)
  myMView.ActiveViewIndex = 0;
else
  myMView.ActiveViewIndex = 1;
Run Code Online (Sandbox Code Playgroud)

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

<asp:PlaceHolder ID="myPholder"  runat="server"></asp:PlaceHolder>
Run Code Online (Sandbox Code Playgroud)

按照方法1中的Prashant指令进行操作,并使用DNN注册MasterControl.在后面的代码中,添加以下内容,

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);
}
Run Code Online (Sandbox Code Playgroud)

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