如何显示DotNetNuke中许多选项卡中使用的模块

时间:2016-04-10 06:56:52

标签: dotnetnuke dotnetnuke-module dotnetnuke-7

我们是DNN的新手,我们计划添加一个产品模块,负责添加,编辑,删除,列出和显示产品的详细信息。

我们编写了一个名为ProductsList.ascx的UserControl,其中定义了AddProducts.ascx和ShowPrdoctDetail.ascx,使用Host =>扩展名=> ProductsList =>模块定义=>添加模块控制。

在管理模式下,我们创建了一个页面并将模块拖入其中,以便网站管理员可以添加,编辑,删除和查看每个产品的详细信息。

主页上还有一个幻灯片显示最新产品。此外,产品显示在菜单中。

现在,只要用户点击幻灯片或菜单中显示的产品,我们就会将用户重定向到产品详细信息页面(在我们的例子中为ShowPrdoctDetail.ascx)。

我们知道Globals.NavigateUrl()方法,但它需要tabid和mid才能重定向到特定的页面和模块,而在DNN中,管理员每个添加的页面都会得到不同的tabid和mid。

由于在DNN中,管理员可以创建许多页面并向其添加此模块,我们不知道我们应该将哪个tabid和mid传递给Globals.NavigateUrl()以便将用户导航到产品详细信息页面(ShowPrdoctDetail.ascx )当用户在菜单或幻灯片中点击特定产品时。

非常感谢任何形式的帮助。

1 个答案:

答案 0 :(得分:0)

我要解决这个问题的方法是为详细信息模块创建另一个模块定义,并为其提供友好名称,如"产品详细信息"并将ShowProductDetail.ascx模块控件添加为此新模块定义的默认视图。

然后,您可以将该新模块拖到产品详细信息页面的页面上。

在您的主产品管理模块中,您可以创建一个设置视图,其中包含一个下拉列表,其中包含所有选项卡(页面)的列表,其中包含"产品详细信息"模块开。

您可以使用以下方法获取门户中具有模块实例的选项卡列表:

private List<TabInfo> GetAllModuleTabsbyModuleName(string friendlyName)
{
    List<TabInfo> results = new List<TabInfo>();
    Dictionary<int, int> dups = new Dictionary<int, int>();

    ModuleController mc = new ModuleController();
    ArrayList oModules = mc.GetModulesByDefinition(base.PortalId, friendlyName);

    TabController tc = new TabController();
    TabCollection oTabs = tc.GetTabsByPortal(base.PortalId);

    foreach (ModuleInfo oModule in oModules)
    {
        foreach (KeyValuePair<int, TabInfo> oTab in oTabs)
        {
            if (oTab.Key == oModule.TabID && !dups.ContainsKey(oModule.TabID))
            {
                results.Add(oTab.Value);
                dups.Add(oModule.TabID, oModule.TabID);
            }
        }
    }
    return results;
}  

您可以将其绑定到下拉列表选项,管理员可以选择在主模块上单击产品时将重定向的页面。

ddlProdDetailsTab.DataSource = GetAllModuleTabsbyModuleName("Product Details");
ddlProdDetailsTab.DataValueField = "TabID";
ddlProdDetailsTab.DataTextField = "TabName";
ddlProdDetailsTab.DataBind();

因此,从设置中,您知道要重定向到的TabId,然后您需要moduleId,并且可以使用NavigateUrl()创建重定向。

var pdTab = TabController.Instance.GetTab(Convert.ToInt32(Settings["ProductDetailTabId"]), PortalId);
var pdModule = pdTab.Modules.Cast<ModuleInfo>().FirstOrDefault(m => m.ModuleName == "Product Details");
var productLink = Globals.NavigateURL(pdTab.TabId, "", "mid=" + pdModule.ModuleId, "productId=" + productId);