我们是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 )当用户在菜单或幻灯片中点击特定产品时。
非常感谢任何形式的帮助。
答案 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);