Установить item.selected в меню управления ASP.NET - PullRequest
2 голосов
/ 05 мая 2010

ASP.NET новичок здесь. На странице я бы хотел выбрать соответствующий пункт меню для выбранного. Мой подход заключается в следующем: На Home.aspx.cs:

Menu menu = (Menu)Master.FindControl("Menu1");

if (menu.Items.Count > 0)
{
    menu.FindItem("Home").Selected = true;
}

Проблема в том, menu.item.count == 0. Мое меню привязано к карте сайта, если это имеет значение.

Ответы [ 3 ]

4 голосов
/ 05 мая 2010

Я думаю, что вы должны установить выбранный элемент в событии MenuItemDataBound (адаптировать свой код):

protected void Menu1_MenuItemDataBound(object sender, MenuEventArgs e)
{
    if (SiteMap.CurrentNode != null)
    {
        if (e.Item.Text == SiteMap.CurrentNode.Title)
        {
            e.Item.Selected = true;
        }
    }
}

Дополнительный контент, показывающий, как обрабатывать ссылки в меню, имеющем в качестве источника данных карту сайта ...

Чтобы в новом окне была открыта ссылка меню, созданная из web.sitemap ...

На странице asp.net добавьте событие OnMenuItemDataBound:

<asp:Menu ID="mnuFooter" runat="server"
DataSourceID="SiteMapDataSource1"
OnMenuItemDataBound="mnuFooter_MenuItemDataBound">
</asp:Menu>

В web.sitemap добавить? символ URL:

В коде позади захватите событие MenuItemDataBound:

protected void mnuFooter_MenuItemDataBound(Object sender, MenuEventArgs e)
{
    if (e.Item.NavigateUrl.Contains("?"))
    {
        e.Item.Target = "_blank";
    }
}

Любой URL в web.sitemap, который содержит? откроется в новом окне. Обратите внимание, используйте любой другой действительный символ URL вместо символа? если необходимо.

Обзор управления меню ASP.NET

0 голосов
/ 27 августа 2011

Если ваш файл web.sitemap содержит внешние ссылки (ссылки на другие домены), тогда эти ссылки должны начинаться с http: // или https://,, а ссылки на локальный файл не будут - они будут просто относительными ссылками из текущее местоположение загруженного документа.

Таким образом, нет необходимости дополнять URL-адреса дополнительными символами, если нужные символы уже есть (http или https).

protected void mnuFooter_MenuItemDataBound(Object sender, MenuEventArgs e) 
{ 
    string theURL = e.Item.NavigateUrl;
    if (theURL.Contains("http://") || theURL.Contains("https://")) 
    { 
        e.Item.Target = "_blank"; 
    } 
} 

Если у вас есть локальный файл, который вы хотите открыть в новом окне, просто измените URL-адрес с локальной ссылки на полный URL-адрес (для загрузки этого файла потребуется немного больше времени, поскольку URL-адрес придется разрешить).

0 голосов
/ 17 июня 2010

ОК, вот чем я закончил. (Спасибо, Лениэль, за то, что указал мне правильное направление.) Следующий код находится в коде основного файла, который содержит элемент управления меню. Комментарии в коде показывают мое удивление, что этот элемент управления не позволяет выбирать несколько элементов одновременно. Итак, в многоуровневом меню я не смог показать как выбранный, так и текущий узел, и его родитель. (Если я что-то упустил.)

// This is where we set the current node's ROOT menu item's selected property to
    // true.  The current node won't show as selected, but it's parent will be.
    // As explained elsewhere, this was a UI decision based on the fact that the menu 
    // can only have one menu item selected at a time.
    // If the menu wasn't dataBound, this code would be in Page_Load.
    protected void SideMenu_DataBound1(object sender, EventArgs e)
    {           
        Menu menu = (Menu)this.FindControl("SideMenu");    // Get Menu Object

        string parent = null;

        // First check that there's a current node - there wont be one if the user
        // accesses this page from a bookmark.
        if (SiteMap.CurrentNode != null)
        {
            // Check if the current place in the SiteMap is in the first level of the menu
            // or a child menu item. 
            if (SiteMap.CurrentNode.ParentNode.ParentNode != null)
                parent = SiteMap.CurrentNode.ParentNode.Description;  // It's a child - has a parent

            if (parent == null)  // a parent node
            {
                MenuItem item = menu.FindItem(SiteMap.CurrentNode.Description);
                item.Selected = true;
            }
            else   // a child menu item
            {
                // Get it's parent node and set it's selected property to true.
                MenuItem item = menu.FindItem(parent);
                item.Selected = true;
                // Following comments left in to show how to get at
                // a menu item that's not in the first level.  The trick is the
                // "/" separator, which is the pathSeparator property of the menu
                // control.

                //  The menu control
                // only allows one item to be selected at a time.  This is true, even though
                // the MenuItem class has a selected property, which implies each item 
                // can have a selected property but it's not the case.
                //path = parent + "/" + current;
                //MenuItem item2 = menu.FindItem(path);
                //item2.Selected = true;
            }
        }
    }
...