次のような XML ファイルがあります。
<SiteMenuItems>
<SiteMenuItem text="Home" navigateurl="/Default.aspx" tooltip="Return Home" />
<SiteMenuItem text="Admin" roles="Admin">
<SiteMenuItem text="User Admin" navigateurl="/Authorized/UserAdmin/Default.aspx" roles="SuperAdmin" />
</SiteMenuItem>
</SiteMenuItems>
この StackOverflow question で見つけた例を使用して、次のコードを思いつくことができました。
public string GetMenu()
{
XDocument xmlDoc = XDocument.Load(HttpContext.Current.Server.MapPath(@"~/App_Data/SiteMenu.xml"));
xmlDoc = FilterRoles(xmlDoc); //Working on role problem
return ExecuteXSLTransformation(xmlDoc.ToString());
}
private XDocument FilterRoles(XDocument xmlDoc)
{
XElement element = xmlDoc.Element("SiteMenuItems");
XElement root = new XElement("SiteMenuItems",
(
from sm
in element.Elements("SiteMenuItem")
where UserHelper.IsUserAuthorized(sm.Attribute("roles"))
select new XElement(sm))
);
XDocument menuXml = new XDocument();
menuXml.Add(root);
return menuXml;
}
私が抱えている問題は、コードが最初のレベルのみをフィルタリングしていることです:
<SiteMenuItem text="Admin" roles="Admin">
しかし、内部の SiteMenuItem もフィルタリングする方法がわかりません。
<SiteMenuItem text="User Admin" navigateurl="/Authorized/UserAdmin/Default.aspx" roles="SuperAdmin" />
現在のように、管理者ロールを持っている場合は、「ユーザー管理者」アイテムも返します。
[更新] woodings のおかげで、私の子ノードは「IsUserAuthorized」テストを通過するようになりました。
残念ながら、テストで "User Admin" ノードに対して "false" が返されても、そのノードは XML ドキュメント全体の一部として返されます。
私はそれが次のようなものを返すことを望んでいました:
<SiteMenuItems>
<SiteMenuItem text="Home" navigateurl="/Default.aspx" tooltip="Return Home" />
<SiteMenuItem text="Admin" roles="Admin">
</SiteMenuItem>
</SiteMenuItems>
何か案は?
再度、感謝します!!