Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果选择了子节点,则在父节点上添加CSS类_C#_Asp.net_Xml - Fatal编程技术网

C# 如果选择了子节点,则在父节点上添加CSS类

C# 如果选择了子节点,则在父节点上添加CSS类,c#,asp.net,xml,C#,Asp.net,Xml,我有一个递归方法,可以从XML文档创建无序列表。要检查我所在的节点,我使用querystring匹配XML文档中的URL 如果我位于父节点的子节点上,我需要在父节点上添加类“current” 像这样: MenuItem 1 MenuItem 2 [class current] MenuItem 3 [class current] (selected node) MenuItem 4 所以我需要一些函数来找到这个节点,并在这个节点上放置一个类 如果您需要更多代码、

我有一个递归方法,可以从XML文档创建无序列表。要检查我所在的节点,我使用querystring匹配XML文档中的URL

如果我位于父节点的子节点上,我需要在父节点上添加类“current”

像这样:

MenuItem 1 MenuItem 2 [class current] MenuItem 3 [class current] (selected node) MenuItem 4 所以我需要一些函数来找到这个节点,并在这个节点上放置一个类

如果您需要更多代码、信息或其他任何信息,请说出来!:-)


谢谢大家!

这不是一个特别优雅的解决方案,但如果我正确理解了问题,您可以创建一个方法来检查是否选择了子节点:

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);
}

我试图创建一个小单元测试来证明我的想法。基本上,您得到当前选定的节点,然后递归地遍历其父节点

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));

    }
private bool IsParentOf(XmlNode parentNode,XmlNode节点)
{
if(node.ParentNode==null)返回false;
return node.ParentNode==ParentNode | | IsParentOf(ParentNode,node.ParentNode);
}
[测试方法]
公共void TestMethod1()
{
字符串xml=
@"
";
字符串url=“MenuItem3.aspx”;
XmlDocument doc=新的XmlDocument();
doc.LoadXml(“+xml+”);
var xPathFormat=“//MenuItem[@Url='{0}']”;
var currentNode=doc.SelectSingleNode(string.Format(xPathFormat,url));
var menuItem1=doc.SelectSingleNode(string.Format(xPathFormat,“menuItem1.aspx”);
IsFalse(IsParentOf(menuItem1,currentNode));
var menuItem2=doc.SelectSingleNode(string.Format(xPathFormat,“menuItem2.aspx”);
IsParentOf(menuItem2,currentNode));
}

谢谢您的回答。但我解决了自己的问题。你们为你们的努力赢得了选票

以下是我的解决方案:

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;
    }
似乎很有魅力!:-)

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");
}
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;
    }