Я бы посоветовал использовать навигационные устройства: https://router.vuejs.org/guide/advanced/navigation-guards.html#per-route-guard
Пример:
const router = new VueRouter({
routes: [
{
path: '/foo',
component: Foo,
beforeEnter: (to, from, next) => {
if (!isLoggedIn()) {
next({
path: '/login'
})
} else {
next()
}
}
}
]
})
Одна проблема, которую я вижу, то, что в последнем фрагменте кода, ...Elements("userid")
возвращает список объектов XElement, которые не могут содержать Строку, возвращенную свойством Value. Это должно работать...
IEnumerable<XElement> rosters = obRoot.Elements("rosterlist").Elements("roster");
var rosterUserIds = (rosters.Elements("userid").Select(r => r.Value));
IEnumerable<XElement> users = obRoot.Elements("userlist").Elements("user")
.Where(u => rosterUserIds.Contains(u.Attribute("userid").Value));
Однако я сделал бы это при помощи запроса соединения.. Выберите пользовательские списки соединения на идентификаторе пользователя
Это прошло бы примерно так
string sXml = @"
<root>
<rosterlist>
<roster>
<userid>1</userid>
<name>R1</name>
<etc></etc>
</roster>
<roster>
<userid>2</userid>
<name>R2</name>
<etc></etc>
</roster>
</rosterlist>
<userlist>
<user userid='1'>
<name>User on roster</name>
</user>
<user userid='5'>
<name>User not on roster</name>
</user>
</userlist>
</root>
";
XElement obRoot = XElement.Parse( sXml );
var results = from user in obRoot.Elements("userlist").Elements("user")
join roster in obRoot.Elements("rosterlist").Elements("roster")
on user.Attribute("userid").Value equals roster.Element("userid").Value
select new {Name=user.Element("name").Value, RosterName=roster.Element("name").Value} ;
foreach (var v in results)
{
Console.WriteLine("{0, -20} on Roster {1, -20}", v.Name, v.RosterName);
}
Выводы:
User on roster on Roster R1