在 Razor 中,如何根据元素的属性检查 ViewBag IEnumerable 对象中是不是存在对象?

Posted

技术标签:

【中文标题】在 Razor 中,如何根据元素的属性检查 ViewBag IEnumerable 对象中是不是存在对象?【英文标题】:In Razor, how to check existence of an object in ViewBag IEnumerable object based on a property of the element?在 Razor 中,如何根据元素的属性检查 ViewBag IEnumerable 对象中是否存在对象? 【发布时间】:2016-08-16 18:40:26 【问题描述】:

我有一个名为AppPrivilege 的模型对象,它包含一个名为PrivilegeName 的公共字符串属性。在控制器中,我生成了这些对象的集合,并将它们放在 ViewBag 中,如下所示(其他对象类型都是我的项目自定义的):

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

现在在一个视图中,我如何检查是否存在具有我选择的PrivilegeName 的任何元素AppPrivilege,例如“读取”?这是我试图在视图中实现的结构:

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

            
           

我解决此要求的方法包括生成一个可能较大的所有PrivilegeName 值连接的字符串,并将其传递给 ViewBag,然后我可以在视图中进行字符串检查。但是,这似乎对性能不友好,所以我想以更合适的方式来做。

谢谢。

【问题讨论】:

【参考方案1】:

ViewBag 是一个动态字典。您需要将其转换为特定类型 IEnumerable&lt;AppPrivilege&gt; 以便您可以在其上运行 LINQ 扩展方法。

这里是使用Any() 方法查看ViewBag.PrivilegeSet 集合中至少存在一个项目的代码,其中PrivilegeName“读取”

@if (ViewBag.PrivilegeSet != null)

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

【讨论】:

谢谢!有效。使用== 代替字符串方法有什么缺点吗? 在这个字符串到字符串的比较中,为了便于阅读,我更喜欢=。这是一篇关于它的好帖子blogs.msdn.microsoft.com/csharpfaq/2004/03/29/…

以上是关于在 Razor 中,如何根据元素的属性检查 ViewBag IEnumerable 对象中是不是存在对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Razor 视图中基于安全性隐藏特定元素,而视图中没有逻辑?

如何在 razor MVC 4 中添加具有条件值的第二个 css 类

如何将对象属性作为参数传递给 Razor 组件

Razor 页面:如何动态更改按钮属性(颜色、文本)以反映后端更改

Nancy - Razor 视图引擎

如何绑定到列表作为 MVC 3 Razor 中模型上的属性?