您的位置:首页 > 编程语言

用XML配置菜单的一种思路,附一些不太准确的测试代码

2013-01-10 11:56 330 查看

///<summary>
///Configs
///addedbyzbw911
///</summary>
[XmlRoot("menulist")]
publicclassMenuList
{
[XmlElement(ElementName="group",Type=typeof(Group))]
publicGroup[]groups;
}
///<summary>
///每个菜单的单元组
///</summary>
publicclassGroup
{
[XmlAttribute(AttributeName="title")]
publicstringtitle;
[XmlArray(ElementName="node")]
[XmlArrayItem(ElementName="node")]
publicNode[]Nodes;
}
///<summary>
///每个菜单的结点,每个结点下面还有可能会有菜单
///</summary>
publicclassNode
{
[XmlElement(ElementName="node")]
publicNode[]Nodes;
[XmlAttribute("href")]
publicstringhref{get;set;}
[XmlAttribute("target")]
publicstringtarget{get;set;}
[XmlAttribute("rel")]
publicstringrel{get;set;}
[XmlAttribute("name")]
publicstringname{get;set;}
[XmlAttribute(AttributeName="title")]
publicstringtitle{get;set;}
[XmlAttribute(AttributeName="url")]
publicstringurl{get;set;}
}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

上面定义的菜单的个结构,菜单由多个group组成,每个group包含多个node,node是自包含,这样实现了无限级联菜单,
其实group也是可以用node来代替的,
但是,之所谓增加一个group无非也是为了使层次稍微清晰一点点。
下面是与之相关的一些测试代码,
publicclasstest
{
publicMenuListt(outstringall)
{
stringapplicationBaseDirectory=null;
//try
//{
applicationBaseDirectory=AppDomain.CurrentDomain.BaseDirectory;
//}
//catch(Exceptionex)
//{
////LogLog.Warn(declaringType,"ExceptiongettingApplicationBaseDirectory.ConfigFilepropertypath["+m_configFile+"]willbetreatedasanabsolutepath.",ex);
//}

//if(applicationBaseDirectory!=null)
//{
//Justthebasedir+theconfigfile
stringfullPath2ConfigFile=HttpContext.Current.Server.MapPath("~/App_Data/Memu.xml");//Path.Combine(applicationBaseDirectory,"");
//}
//else
//{
//fullPath2ConfigFile=m_configFile;
//}

varmySerializer=newXmlSerializer(typeof(MenuList));
//Toreadthefile,createaFileStream.
varmyFileStream=File.ReadAllBytes(fullPath2ConfigFile);

//CalltheDeserializemethodandcasttotheobjecttype.
var_Configuration=(MenuList)mySerializer.Deserialize(newMemoryStream(myFileStream));

varxxx=newMenuList
{
groups=new[]
{
newGroup
{
Nodes=new[]{newNode
{
title="tit",
url="u",
Nodes=new[]
{
newNode
{
href="href",
name="name"
},
newNode
{
href="href",
name="name"
}
}

}
,newNode
{
href="href",
name="name"
},
newNode
{
href="href",
name="name"
}
},
title="groptitle",

},
newGroup
{
Nodes=new[]{newNode
{
title="tit",
url="u"
,Nodes=new[]{
newNode
{
href="",
name="name",
rel="aaa"
,Nodes=new[]
{
newNode
{
href="href",
Nodes=newNode[]
{
newNode
{
href="aaaaa"
}
}
}
}

}
}
}

},
title="groptitle"
},
}
};

varstream=newMemoryStream();
//stream.Seek(0,SeekOrigin.Begin);
mySerializer.Serialize(stream,xxx);
//StreamReadersr=newStreamReader(stream);
//stringall=sr.ReadToEnd();

//stream.ToArray();

all=System.Text.Encoding.Default.GetString(stream.ToArray());

return_Configuration;

}
}

这样就可以从一个xml文件将之序列化一个对象,然后再通过这个对象进行菜单的生成操作,

下面是大致的XML文件格式,

<?xmlversion="1.0"?>
-<menulistxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema">
-<grouptitle="groptitle">
-<node>
-<Nodetitle="tit"url="u">
<nodehref="href"name="name"/>
<nodehref="href"name="name"/>
</Node>
<Nodehref="href"name="name"/>
<Nodehref="href"name="name"/>
</node>
</group>
-<grouptitle="groptitle">
-<node>
-<Nodetitle="tit"url="u">
-<nodehref=""rel="aaa"name="name">
-<nodehref="href">
<nodehref="aaaaa"/>
</node>
</node>
</Node>
</node>
</group>
</menulist>

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

最后说一句,实际上,菜单的生成不必要如此复杂,实际上我为的是将权限与菜单的对应放在一起,不去程序中写

if(有什么权限)

{显示某个菜单}

这样的形式,才使用这样的方案。

实际上,生成菜单与权限对应还有其它方案,如在数据库中,但这个实际上与这个方案类似。

不选择数据库,是因为,菜单的变化真不会有想像中如此那样多的变化,何改再去做一些CURD的方法呢,用最简单的方法来解决这个问题吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: