Как показать модуль, который используется во многих вкладках в DotNetNuke

Мы новичок в DNN и планируем добавить модуль продукта, который отвечает за добавление, редактирование, удаление, перечисление и отображение деталей продуктов.

Мы написали UserControl с именем ProductsList.ascx, в котором определены AddProducts.ascx и ShowPrdoctDetail.ascx, используя Host => Extensions => ProductsList => Module Definition => Add Module Control.

В режиме администратора мы создали страницу и перетащили на нее модуль, чтобы администратор сайта мог добавлять, редактировать, удалять и просматривать детали каждого продукта.

Также на главной странице есть слайд-шоу, в котором показаны последние продукты. Кроме того, продукты показаны в меню.

Теперь мы хотим перенаправить пользователя на страницу сведений о продукте (ShowPrdoctDetail.ascx в нашем случае) всякий раз, когда он / она щелкает продукт, показанный в слайд-шоу или в меню.

Нам известен метод Globals.NavigateUrl (), но ему нужны tabid и mid для перенаправления на определенную страницу и модуль, а в DNN каждая страница, добавленная администратором, будет иметь разные tabid и mid.

Поскольку в DNN администратор может создать множество страниц и добавить к ним этот модуль, мы понятия не имеем, какие tabid и mid мы должны передать Globals.NavigateUrl (), чтобы переместить пользователя на страницу сведений о продукте (ShowPrdoctDetail.ascx), когда пользователь нажал на конкретный продукт в меню или слайд-шоу.

Любая помощь приветствуется.


person MajidAndMasoud Manzoori    schedule 10.04.2016    source источник


Ответы (2)


Попытайтесь сохранить текущий tabid в БД при добавлении на страницу модуля сведений о продукте. А с помощью ProductId вы можете получить табид сведений о продукте и использовать его для перенаправления на правильную страницу.

person erw13n    schedule 10.04.2016

Я хотел бы решить эту проблему, создав еще одно определение модуля для модуля сведений и присвоив ему понятное имя, например «Сведения о продукте», и добавив элемент управления модуля 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);
person DotNetNuclear    schedule 10.04.2016