Как настроить хлебную крошку на странице ASP.net

2

Моя иерархия папок для страниц (все они находятся в одной папке):

Site.Master
Default.aspx
find_provider.aspx
provider.aspx

У меня установлена ​​страница Web.sitemap:

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
    <siteMapNode url="~/Default.aspx" title="Home"  description="Homepage">
        <siteMapNode url="~/find_provider.aspx" title="Provider" description="Search for provider">
            <siteMapNode url="~/provider.aspx" title="Profile" description="Shows each provider profile" />
        </siteMapNode>
    </siteMapNode>
</siteMap>

Я звоню в своем MasterPage:

<div id="navigation">
    <ul>
        <li><asp:HyperLink runat="server" ID="lnkHome" NavigateUrl="~/Default.aspx">Home</asp:HyperLink></li>

        <asp:Repeater runat="server" ID="menu" DataSourceID="SiteMapDataSource1">
            <ItemTemplate>
                <li>
                    <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl='<%# Eval("Url") %>'><%# Eval("Title") %></asp:HyperLink>
                </li>
            </ItemTemplate>
        </asp:Repeater>
    </ul>

    <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" ShowStartingNode="false" />
</div>

Итак Default.aspx - моя целевая страница. Пользователь может нажать find_provider.aspx, чтобы найти поставщика по своему выбору. Для каждого результата поиска провайдера пользователь может щелкнуть ссылку PROFILE, чтобы просмотреть информацию для каждого отдельного провайдера, который является страницей provider.aspx.

Итак:

  • Если я на домашней странице, моя сводка должна быть: Home
  • Если я нахожу страницу поставщика, моя сводка должна быть: Home Provider
  • Если я на странице профиля, моя сводка должна быть: Home Provider Profile

Вместо этого я вижу это на своей странице (независимо от того, на какой странице я нахожусь):

Пожалуйста, помогите мне изменить код, чтобы отображать палитру для каждого sitenode и подэтапа.

Пример того, что я хочу достичь:

HTML:

<div class="bcHolder brClear"> <!-- BC MAIN -->
    <div class="innerBreadCrumb"> <!-- INNER BC -->
        <ul id="breadcrumb">
            <li><a href="default.aspx" title="Home"><img src="theImages/homeIcon.gif" alt="Home" title="Home" class="home" /></a></li>
            <li id="bc_fp"><a href="find_provider.aspx" title="Find a Provider">Find a Provider</a></li>
            <!--<li>{ON THE CURRENT PAGE TEXT/URL</li>-->
        </ul>
    </div> <!-- INNER BC -->
</div> <!-- BC MAIN -->

Вывод:

Изображение 174551

  • 1
    На самом деле это не так сложно, и вот учебник о том, как это сделать. Я лично создал свою собственную, используя MasterPage, и отслеживал, на какой странице я находился + какая страница, на которую я перешел, весь код был выполнен на уровне MasterPage. Есть много способов снять шкуру с этой кошки. Asp.NET BreadCrub
  • 0
    Благодарю. Я уже проверил страницу. Кастомизация очень ограничена. Я хочу сделать это так, как я показываю в своем вопросе (обновил его)
Показать ещё 2 комментария
Теги:
repeater
sitemapprovider

2 ответа

1
Лучший ответ

В настоящее время это работает для меня. У меня есть еще много кода в моей Page_Load, но это важная часть

в моем текущем предварительном событии MasterPages. У меня есть метод под названием

 protected void Page_PreRender(object sender, EventArgs e)
 {
     SetNavigationLabel();
 }

Затем я устанавливаю это внутри страницы Page_Load()

protected void Page_Load(object sender, EventArgs e)
{   
    var pageUrl = GetCurrentPageName();
}

private void SetNavigationLabel()
{
    RadMenu NavigationMenu = (RadMenu)this.FindControl("RadMenu1");
    foreach (RadMenuItem m in NavigationMenu.Items)
    {
        if (Request.Url.AbsoluteUri.ToLower() == Server.MapPath(Request.Url.AbsolutePath.ToLower()) || m.Selected)
        {
            string sPagePath = System.Web.HttpContext.Current.Request.Url.AbsolutePath;
            System.IO.FileInfo oFileInfo = new System.IO.FileInfo(sPagePath);
            string sPageName = "~/" + oFileInfo.Name;
            oFileInfo = null;
            var navName1 = NavigationMenu.FindItemByUrl(Request.RawUrl);
            var navName = navName1.Text;
            lblNavTitle.Text = navName;
            ((IDisposable)NavigationMenu).Dispose();
            break;
        }
    }
}

public string GetCurrentPageName()
{
     var sPath = System.Web.HttpContext.Current.Request.Url.AbsolutePath;
     FileInfo oInfo = new FileInfo(sPath);
     var sReturn = oInfo.Name;
     oInfo = null;
     return sReturn;
}
  • 0
    Спасибо! Что такое RadMenu?
  • 1
    о, это от Telerik, вы можете игнорировать это .. извините за это, если вы используете меню, используйте элемент управления этого меню вместо того, где я использую Telerik
Показать ещё 5 комментариев
3

В отношении вашего вопроса здесь: Как использовать стиль Bootstrap в BreadCrumb с моим меню ASP.NET?

SiteMapPath действует как тег <ul/> в рендеринге HTML. Поэтому, чтобы использовать метод там, ваша структура, вероятно, будет примерно такой:

<div class="bcHolder brClear"> <!-- BC MAIN -->
    <div class="innerBreadCrumb"> <!-- INNER BC -->
        <asp:SiteMapPath ID="SiteMap1" 
        runat="server"
        PathSeparator=" / " 
        ParentLevelsDisplayed="1" 
        PathDirection="RootToCurrent"
        ShowToolTips="true">
        <CurrentNodeStyle CssClass="current-node"></CurrentNodeStyle>
        <NodeTemplate>
            <li><a href="default.aspx" title="Home"><img src="theImages/homeIcon.gif" alt="Home" title="Home" class="home" /></a></li>
            <li id="bc_fp"><a href="find_provider.aspx" title="Find a Provider">Find a Provider</a></li>
            <!--<li>{ON THE CURRENT PAGE TEXT/URL</li>-->
            </NodeTemplate>
        </asp:SiteMapPath>
    </div> <!-- INNER BC -->
</div> <!-- BC MAIN -->

И затем добавьте javascript, необходимый для разрешения гиперссылки CurrentNode.

Надеюсь, что это поможет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню