|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
也许C#刚上市的时候有些抄袭Java吧,但自从C#2.0上市之后,整个局面就扭转乾坤了,不但Java在模仿C#,而且他从来都没能跟得上C#的脚步。asp.net|sitemap|成绩SiteMap,网站舆图,在网站建立的时分是很有效的。它能够间接绑定在Men和TreeView控件上,另有一个唆使以后路径的SiteMapPath控件,也能够间接绑定。
这是他经常使用的xml界说:
<siteMapNodeurl="Course/Group/GroupList.aspx"title="GroupAdmin">
这个SiteMap的权限已和Membership分离起来了,分歧权限的用户所看到的舆图已被把持了。能够设置role属性来扩大破例的会见允许。注重,是破例的会见允许。
<siteMapNodeurl="Course/Tests/TestList.aspx"title="TestAdmin"role="student">这里有些先容:http://zmsx.cnblogs.com/archive/2006/01/03/310381.aspx
复杂的利用这里不作赘述,只是会商一下怎样和扩大一下,让他能够会见资本时附带参数。
起首先容如许一个资本:MySiteMapTool:http://quitgame.cnblogs.com/archive/2005/11/24/283910.aspx
这位仁兄已供应了一个工具,能够在程序直达发带参数的哀求
好比:MySiteMap.Forward("Details","AlbumID={0}&Page={1}",1,4);
确是复杂有用。
如今想要的功效是:由于各个液面都必要分歧的参数,以是在没有这些参数的情形下就克制用户会见谁人页面,转而会见父一级页面,递回。
起首,SiteMap自己有个SiteMapResolve事务,在以后路径被剖析时触发,这是一段来自MSDN的代码
privatevoidPage_Load(objectsender,EventArgse)
{
//TheExpandForumPathsmethodiscalledtohandle
//theSiteMapResolveevent.
SiteMap.SiteMapResolve+=
newSiteMapResolveEventHandler(this.ExpandForumPaths);
}
privateSiteMapNodeExpandForumPaths(Objectsender,SiteMapResolveEventArgse)
{
//ThecurrentnoderepresentsaPostpageinabulletinboardforum.
//Clonethecurrentnodeandallofitsrelevantparents.This
//returnsasitemapnodethatadevelopercanthen
//walk,modifyingeachnode.Urlpropertyinturn.
//Sincetheclonednodesareseparatefromtheunderlying
//sitenavigationstructure,thefixupsthataremadedonot
//effecttheoverallsitenavigationstructure.
SiteMapNodecurrentNode=SiteMap.CurrentNode.Clone(true);
SiteMapNodetempNode=currentNode;
//ObtaintherecentIDs.
intforumGroupID=GetMostRecentForumGroupID();
intforumID=GetMostRecentForumID(forumGroupID);
intpostID=GetMostRecentPostID(forumID);
//Thecurrentnode,anditsparents,canbemodifiedtoinclude
//dynamicquerystringinformationrelevanttothecurrently
//executingrequest.
if(0!=postID)
{
tempNode.Url=tempNode.Url+"?PostID="+postID.ToString();
}
if((null!=(tempNode=tempNode.ParentNode))&&
(0!=forumID))
{
tempNode.Url=tempNode.Url+"?ForumID="+forumID.ToString();
}
if((null!=(tempNode=tempNode.ParentNode))&&
(0!=forumGroupID))
{
tempNode.Url=tempNode.Url+"?ForumGroupID="+forumGroupID.ToString();
}
returncurrentNode;
}
这段代码只是给以后路径加载参数。
已经实验过利用相似的办法,可是SiteMapPath弄定了,Menu就绑定不上数据了。而且只能处置一部分数据。
厥后,分离SiteMapTool谁人类,又写出几个函数能够办理这个成绩
这是修正以后的sitemap文件,加了一个设置项:rule,内里的参数是这个页面必要的参数。假如以后高低文没有这些参数,那末克制用户会见这个页面。
<siteMapNodeurl="Course/Group/GroupDetail.aspx"title="GroupDetail"rule="cid;gid">
这是两个函数,递回处置一切的路径。privatestringMakeURL(SiteMapNodenode)
{
node.ReadOnly=false;
//findthestaticurl
stringurl=MySiteMap.FindForward(node.Title);
if(node["rule"]!=null&&node["rule"].Length>0)
{
//ifhavetherule,thencheck
string[]paramSet=node["rule"].Split(;);
//check
for(inti=0;i<paramSet.Length;i++)
{
//ifrequesthavenotsuchaparam,theninvokeselftocheckhisparent
if(HttpContext.Current.Request.Params[paramSet[i]]==null)
returnMakeURL(node.ParentNode);
}
//ifpass,thenaddalltheparamsandreturnthevalue
url+="?";
for(inti=0;i<paramSet.Length;i++)
{
stringkey=paramSet[i];
//cid--->cid=1.theformerformatislike:rule=cid;tid
url=url+key+"="+HttpContext.Current.Request.Params[key]+"&";
}
returnurl.Substring(0,url.Length-1);//removelast&
}
else
{
//ifthereisnorulethenreturntheurldirectly
returnurl;
}
}privatevoidReBindData(SiteMapNoderoot)
{
stringurl=MakeURL(root);
if(url!="")
root.Url=url;
for(inti=0;i<root.ChildNodes.Count;i++)
{
ReBindData(root.ChildNodes[i]);
}
}在ReBindData内里递回挪用MakeUrl函数。
MakeUrl函数内里挪用的MySiteMap.FindForward函数就是来自那位http://quitgame.cnblogs.com/archive/2005/11/24/283910.aspx的完成。
不外使用的是后必要做一些修改:他本来的完成是用静态的类云云加载
//SiteMapNodeCollectionsmc=SiteMap.RootNode.GetAllNodes();
//siteMapCol=newNameValueCollection();
//IEnumeratorie=smc.GetEnumerator();
//while(ie.MoveNext())
//{
//siteMapCol[((SiteMapNode)ie.Current).Title]=((SiteMapNode)ie.Current).Url;
//}可是,因为用户在没有上岸的时分,限于权限,它能会见的页面无限,以是SiteMap.RootNode.GetAllNodes();失掉的不是一切数据,大概只是一部分大概0。
修改体例就是本人写一个函数,间接读取xml文件,递回猎取一切数据界说。
出处:BLOG为所欲为
竟发现没有太大的帮助。总觉得要用起来,感觉到不了位。因为公司机器的原因,一直没有安装vs.net(也从来没有用过)。以前做asp的时候一直用DW(感觉其代码联想功能不错),可现在到了asp.net却不习惯了。 |
|