Как я могу скрыть корневой узел SiteMapPath на домашней странице?

StackOverflow https://stackoverflow.com/questions/1050610

  •  20-08-2019
  •  | 
  •  

Вопрос

Как я могу скрыть корневой узел в элементе управления SiteMapPath, когда пользователь находится на странице корневого узла?Например, моя цепочка навигации на дочерней странице:

Главная > Продукция > Молотки > Шариковые наконечники

и это нормально.Но когда пользователь находится на домашней странице, элемент управления SiteMapPath отображает

Дом

это бесполезный беспорядок.Я хочу запретить отображение Home (корневого узла), когда пользователь находится на домашней странице.У меня есть элемент управления SiteMapPath на главной странице.Кроме того, я использую SiteMapResolve для установки строк запроса в узлах.

Это было полезно?

Решение 3

Мне удалось это понять, но это заняло некоторое время, потому что проблема, с которой я столкнулся, была довольно тонкой.У Шоу-роде правильная идея, и именно это я и делал в Page_Load безуспешно.Причина, по которой это не работало, заключалась в том, что я клонировал узел в SiteMapResolve и возвращение клона.Это произошло раньше Page_Load так SiteMap.CurrentNode сослался на клон и сравнение с SiteMap.RootNode неуспешный.

Вот полное решение:

protected void Page_Load(object sender, EventArgs e)
{
    SiteMapPath1.Visible = (SiteMap.CurrentNode != SiteMap.RootNode);
}

private SiteMapNode SiteMap_SiteMapResolve(object sender, SiteMapResolveEventArgs e)
{
    if (SiteMap.CurrentNode == null || SiteMap.CurrentNode == SiteMap.RootNode)
    {
        return SiteMap.CurrentNode;
    }
    // clone and set querystring in other nodes...
}

Другие советы

Одним из возможных решений было бы просто скрыть SiteMapPath управление на главной странице:

mySiteMapPath.Visible = (SiteMap.CurrentNode != SiteMap.RootNode);

Я видел несколько примеров на основе кода, но вот дешевое решение CSS (хотя ваши целевые браузеры должны поддерживать CSS 2.1), которое скроет корневой узел и следующий разделитель путей.

Уничтожьте корневой узел, установив для RootNodeTemplate пустое значение следующим образом:

<asp:SiteMapPath ID="SiteMapPath1" runat="server" CssClass="breadCrumbTrail">
   <RootNodeTemplate></RootNodeTemplate>
</asp:SiteMapPath>

Это приведет к тому, что для корневого узла ничего не будет отображаться, но разделитель корневых путей все равно будет отображаться, поэтому добавьте эти селекторы CSS в свою таблицу стилей (Важно:обратите внимание, что я дал моему элементу SiteMapPath1 CssClass с именем «breadCrumbTrail»):

.breadCrumbTrail
{
  font-size: small;
}

/*
First child element rendered by a SiteMapPath is an <a> tag you have no control over, 
adjacent to that is your root node's span tag, adjacent to that is the root node's 
path-separator span: don't display it.
*/
.breadCrumbTrail > a:first-child + span + span
{
  display: none;
}

В SiteMapDataSource также имеется свойство ShowStartingNode.Установите для этого параметра значение false, чтобы скрыть корневой узел.

На домашней странице добавьте приведенный ниже скрипт в часть «head»:

protected void Page_Load(object sender, EventArgs e)
{
    SiteMapPath sp = (SiteMapPath)Master.FindControl("SiteMapPath1");
    sp.Visible = (SiteMap.CurrentNode != SiteMap.RootNode);
}

Чтобы применить описанный выше метод, SiteMapPath1 должен быть размещен на главной странице.

Один из правильных способов скрыть корневую заметку SiteMapPath за 3 простых шага:

  • Ссылка на MasterPage из ContentPage

    Пример:

    <%@ MasterType VirtualPath="~/Master.master" %>
    
  • Сделать SiteMapPath защищенным внутренним в классе дизайнера

    Пример:

    protected internal global::System.Web.UI.WebControls.SiteMapPath SiteMapPath1;
    
  • Скрыть это на ContentPage

    Пример:

    Master.SiteMapPath1.Visible = (SiteMap.CurrentNode != SiteMap.RootNode);
    

Я подключил свой файл к моему _Layout.cshtml и обнаружил, что самым простым решением было обернуть оператор If (с ранее предложенной логикой) вокруг блока рендеринга элемента управления и положить этому конец:

@if (SiteMap.CurrentNode != SiteMap.RootNode)
{
  @Html.MvcSiteMap().SiteMapPath()
}
<asp:SiteMapPath ID="contentNavigation" runat="server">
    <RootNodeTemplate>
    </RootNodeTemplate>
</asp:SiteMapPath>

и CSS-код:

#ctl00_contentNavigation span:nth-child(2),span:nth-child(3)
{
    display:none;
}

Недавно у меня возникла аналогичная проблема, но я использую XmlDataSource для меню в своем решении.

Пример структуры исходного XML:

<root>
  <Menu text="" url=""/>
  <Menu text="" url=""/>
</root>

Если вы НЕ хотите отображать «корневой» пункт меню, вам нужно просто установить для свойства XPath в XmlDataSource значение «/root/*».

Родительские уровнидисплейед=0 помогу

<asp:SiteMapPath ID="SiteMapPath1" runat="server" PathSeparator="" 
        ParentLevelsDisplayed="0" >
        <RootNodeTemplate></RootNodeTemplate>            
    </asp:SiteMapPath>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top