Добавить класс CSS на родительский узел, если выбран дочерний узел - PullRequest
0 голосов
/ 12 мая 2009

У меня есть метод recusive, который создает неупорядоченный список из документа XML. Чтобы проверить, на каком узле я размещен, я использую строку запроса, соответствующую URL-адресу в XML-документе.

Мне нужно добавить класс 'current' на родительский узел, если я позиционируюсь на его дочернем узле.

Как это:

    MenuItem 1
    MenuItem 2 [class current]
         MenuItem 3 [class current] (selected node)
    MenuItem 4

Мой XML-документ выглядит так:

<MenuItem Name="MenuItem 1" Url="MenuItem1.aspx"/>
<MenuItem Name="MenuItem 2" Url="MenuItem2.aspx">
    <MenuItem Name="MenuItem 3" Url="MenuItem3.aspx" />
</MenuItem>
<MenuItem Name="MenuItem4" Url="MenuItem4.asp" />

А мой текущий код выглядит так:

foreach (XmlNode item in menuitems)
{
    if (HttpContext.Current.Request.Url.AbsolutePath.ToLower() == item.Attributes["Url"].Value.ToLower())
    {
        writer.AddAttribute(HtmlTextWriterAttribute.Class, "current");
    }
    writer.RenderBeginTag(HtmlTextWriterTag.Li);
    // And so on...
}

Так что мне нужна какая-то функция, чтобы найти этот узел и также поместить класс в этот узел.

Если вам нужно больше кода, информации или чего-либо еще - скажите, пожалуйста! : -)

Спасибо!

Ответы [ 3 ]

1 голос
/ 12 мая 2009

Я попытался создать небольшой юнит-тест, чтобы продемонстрировать свою идею. в основном вы получаете текущий выбранный узел, а затем рекурсивно перебираете его родителей.

private bool IsParentOf(XmlNode parentNode, XmlNode node)
    {
        if (node.ParentNode == null) return false;
        return node.ParentNode == parentNode || IsParentOf(parentNode, node.ParentNode);
    }
    [TestMethod]
    public void TestMethod1()
    {
        string xml =
                @"
            <MenuItem Name=""MenuItem 1"" Url=""MenuItem1.aspx""/>
            <MenuItem Name=""MenuItem 2"" Url=""MenuItem2.aspx"">
                <MenuItem Name=""MenuItem 3"" Url=""MenuItem3.aspx"" />
            </MenuItem>
            <MenuItem Name=""MenuItem4"" Url=""MenuItem4.asp"" />";
        string url = "MenuItem3.aspx";

        XmlDocument doc = new XmlDocument();
        doc.LoadXml("<MenuItems>" + xml + "</MenuItems>");
        var xPathFormat = "//MenuItem[@Url='{0}']";
        var currentNode = doc.SelectSingleNode(string.Format(xPathFormat, url));

        var menuItem1 = doc.SelectSingleNode(string.Format(xPathFormat, "MenuItem1.aspx"));
        Assert.IsFalse(IsParentOf(menuItem1, currentNode));

        var menuItem2 = doc.SelectSingleNode(string.Format(xPathFormat, "MenuItem2.aspx"));
        Assert.IsTrue(IsParentOf(menuItem2, currentNode));

    }
1 голос
/ 12 мая 2009

Это не особенно элегантное решение, но если я правильно понимаю проблему, вы можете создать метод для проверки, выбран ли дочерний узел:

private static bool IsChildSelected(XmlNode item)
{
    foreach(XmlNode child in item.ChildNodes)
    {
        if(HttpContext.Current.Request.Url.AbsolutePath.ToLower() == child.Attributes["Url"].Value.ToLower())
        {
            return true;
        }
    }
    return false;
}

и проверяйте его при переборе узлов:

foreach(XmlNode item in menuitems)
{
    if(HttpContext.Current.Request.Url.AbsolutePath.ToLower() == item.Attributes["Url"].Value.ToLower()
        || IsChildSelected(item))
    {
        writer.AddAttribute(HtmlTextWriterAttribute.Class, "current");
    }
    writer.RenderBeginTag(HtmlTextWriterTag.Li);
}
0 голосов
/ 12 мая 2009

Спасибо за ответы. Но я решил свою проблему. Вы, ребята, получаете голоса за ваши усилия.

Вот мое решение:

System.Collections.Hashtable ht = new System.Collections.Hashtable();
ht.Add("Url", HttpContext.Current.Request.Url.AbsolutePath.ToLower());

XmlNode currentpage = Core.FindChildNode(item, "MenuItem", ht);

if (HttpContext.Current.Request.RawUrl.ToLower() == item.Attributes["Url"].Value.ToLower() || currentpage != null)
{
     writer.AddAttribute(HtmlTextWriterAttribute.Class, "current");
}

Это мой метод FindChildNode

public static XmlNode FindChildNode(XmlNode parent, string name, System.Collections.Hashtable keyvaluecollection)
    {
        if (parent.NodeType != XmlNodeType.Element) return null;
        XmlElement el = (XmlElement)parent;

        XmlNodeList nodes = el.GetElementsByTagName(name);
        foreach (XmlNode node in nodes)
        {
            if (node.NodeType == XmlNodeType.Element)
            {
                bool found = false;
                foreach (string key in keyvaluecollection.Keys)
                {
                    if (node.Attributes[key] != null && node.Attributes[key].Value == (string)keyvaluecollection[key])
                    {
                        found = true;
                    }
                    else
                    {
                        found = false;
                        break;
                    }
                }
                if (found) return node;
            }
        }
        return null;
    }

Кажется, работает как шарм! : -)

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