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

Posted

技术标签:

【中文标题】如何在 Razor 视图中基于安全性隐藏特定元素,而视图中没有逻辑?【英文标题】:How Can I Hide Specific Elements on a Razor View Based on Security without Logic in View? 【发布时间】:2011-04-04 14:48:46 【问题描述】:

我已经为这个不那么古老的问题寻找了优雅的解决方案。如何在 ASP.Net MVC 视图中锁定表单元素,而不在所有地方添加 if...then 逻辑? 理想情况下,来自 OnAuthorization 或 OnResultExecultion 的 BaseController 将检查呈现表单元素并根据角色和范围隐藏/不呈现它们。 我考虑过的另一种方法是编写某种自定义属性,以便与我们使用 [Authorize] 锁定 ActionResults 的方式保持一致。如果不将隐藏对象列表传递给视图并放置 if's all over,这甚至可能吗?

其他背景信息:我们将拥有一个数据库,它会在执行时(基于用户角色/范围)告诉我们哪些元素将被隐藏。我们将 MVC3 与 Razor Viewengine 一起使用。我们正在使用一个 BaseController,其中任何 Controller 方法都可以被覆盖。

对此的任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

您可以使用多种不同的方法:

    根据操作过滤器或控制器中的条件将用户发送到不同的视图(仅显示视图)。 基于字段,您可以将逻辑构建到编辑器模板中,以根据角色/权限读取自定义数据注释。 您可以构建 html 帮助程序来处理逻辑并呈现适当的局部视图、css 类或文本。

更多阅读:

How much logic is allowed in ASP.NET MVC views? ASP.NET MVC 2 Templates, Part 1: Introduction(共有 5 个部分,内容丰富,是开始开发自己的编辑器模板的好地方)

【讨论】:

#1 不是一个选项,但我们已经考虑了 #2 和 #3。 #2 有效,但我不喜欢使用 JS 来决定隐藏什么。我倾向于#3,尽管我宁愿不覆盖每个现有的助手来增加安全性。感谢您的回复! @Zacho - #2 不使用 JS (javascript) 做任何事情。条件逻辑被封装到一个模板中,输出由模型控制。 你有如何做到这一点的例子吗?我有点困惑 #2 和 #3 之间有什么区别。 #2 与如何通过编辑器模板呈现模型属性直接相关。这是你想要做的吗?特别是像@Html.EditorFor(model => model.FirstName) 这样的输出。

以上是关于如何在 Razor 视图中基于安全性隐藏特定元素,而视图中没有逻辑?的主要内容,如果未能解决你的问题,请参考以下文章

Razor 显示/隐藏基于使用 javascript 的单选按钮

有没有办法隐藏ios中视图的特定部分?

MVC Razor 隐藏输入和传递值

在 c# Razor 6.0 页面上的代码隐藏中访问 Html 控件

Razor View 基于一个字段的颜色行

如何使用 Asp.net MVC Razor 将隐藏字段值从一个控制器传递到另一个控制器