2016-08-16 35 views
0

我有一个名为AppPrivilege的模型对象,它包含一个名为PrivilegeName的公共字符串属性。在控制器,我产生这些对象的集合,并把他们在ViewBag,如​​下(其他对象类型都定制到我的项目):在Razor中,如何根据元素的属性检查ViewBag IEnumerable对象中对象的存在性?

SQLRolerecord toCheckPrivs = new SQLRolerecord(); 
IEnumerable<AppPrivilege> privsOfUser = toCheckPrivs.getPrivsForRole(roleUser);   
ViewBag.PrivilegeSet = privsOfUser; 
return View(); 
在视图

现在,我怎么能检查是否存在具有我选择的PrivilegeName的任何元素AppPrivilege,例如“Read”?这是我想在视图中实现结构:

@if (ViewBag.PrivilegeSet != null) 
     { 
      if(ViewBag.PrivilegeSet.Contains(/*search criteria for PrivilegeName*/)) 
      { 
       //valid code here 

      } 
     } 

我来满足这种需求的方法包括产生一个潜在的大字符串连接在一起的所有PrivilegeName值,并通过穿过ViewBag中,在我可以在视图中进行字符串检查。但是,这似乎不是表现友好的,所以我想以更合适的方式来做。

谢谢。

回答

2

ViewBag是一个动态词典。您需要将其转换为特定类型IEnumerable<AppPrivilege>,以便您可以在其上运行LINQ扩展方法。

这里是ViewBag.PrivilegeSet集合中的一个项目存在与PrivilegeName其使用Any()方法见leaset代码“读”

@if (ViewBag.PrivilegeSet != null) 
{ 
    var items = ViewBag.PrivilegeSet as IEnumerable<AppPrivilege>; 
    if(items.Any(d=>d.PrivilegeName=="Read")) 
    { 
    <h1>Exist!</h1> 
    } 
} 
+0

谢谢!有效。使用'=='而不是字符串方法有什么缺点? – ITWorker

+1

在这个字符串到字符串的比较中,我更喜欢'='来提高可读性。这里有一篇关于它的好文章https://blogs.msdn.microsoft.com/csharpfaq/2004/03/29/when-should-i-use-and-when-should-i-use-equals/ – Shyju

相关问题