【问题标题】:Limiting Features in an asp.net mvc application?限制asp.net mvc应用程序中的功能?
【发布时间】:2011-03-21 14:26:38
【问题描述】:

我想知道限制帐户功能的最佳方法是什么。

假设我有一个免费帐户和一个高级帐户。我将如何限制只有高级帐户才能获得的功能?

现在我唯一能想到的就是视图中有很多“if 语句”。

我需要限制的一些项目是。

  1. Jquery Ui 选项卡(高级帐户有一个额外的 jquery ui 选项卡 - 免费有 4 个,但高级帐户有 5 个)。

因此,现在这意味着我需要使用 if 语句来隐藏无序列表,并为包含它的 div 设置一个语句。如果我使用 ajax 选项卡,可能会有一个。

  1. 超链接。我有一些超链接可以加载需要再次对免费用户隐藏的 jquery 对话框,我唯一能想到的就是 if 语句。

这些是我预计需要对免费帐户隐藏的事情。

我认为所有这些“if 语句”在视图中看起来会很糟糕,但是我不希望有多个视图(一个视图用于免费帐户,一个视图用于高级帐户),因为这意味着我可能必须开始重复代码,(即使使用部分视图)变得更加混乱,因为现在我有更多文件要查看,要创建更多操作结果并确定要使用哪个。

在一个网站上,我尝试了多个帐户和操作结果视图,但效果不佳。

那么最好的方法是什么?

【问题讨论】:

    标签: c# .net asp.net-mvc asp.net-mvc-3


    【解决方案1】:

    首先,您需要将此逻辑添加到控制器,而不是视图。您将向视图发送一些数据,向它发出信号,表明它应该显示高级功能与标准功能。但是应该在控制器中决定您是处于高级状态还是标准状态。

    因此,您的视图可能具有 if 语句或某种逻辑来决定是否显示某些功能,但它们将基于您从控制器发送的“帐户级别”数据。

    如果您将“if”语句放入视图中,或者像您的情况一样,您应该考虑编写一个 HTML 帮助器。这将大大清理您的代码。与其编写多个 if,不如在视图中使用 HtmlHelper.JQueryTabs() 之类的东西。在 JQueryTabs 方法中,您将拥有根据帐户级别输出适当 HTML/Javascript 的所有逻辑。

    这是一篇关于creating custom HTML helpers的文章

    【讨论】:

    • 是的,当然决定将在服务器级别(可能是业务层)做出。视图中的“if”语句只会检查它是否应该渲染该区域。我在考虑 html 助手,但有时我觉得它们让事情变得更糟,尤其是在样式方面(你要么必须在助手中对类进行硬编码,要么通过助手将它们全部传递)
    【解决方案2】:

    您可以使用具有两个集合的视图模型,一个用于链接,一个用于选项卡。控制器将根据用户的权限填充这些。在视图中,您可以遍历这些集合并相应地显示它们。

    【讨论】:

    • @harriyott- 当您谈论链接或选项卡时,您是在谈论包含实际 html 标记的 VM,还是在谈论有一个我在视图中循环的集合?
    • 我说的是你在视图中循环的集合。也许是一个 Dictionary,键是链接文本,值是 url
    • 如果你只有一个链接会弹出一个对话框。你是让它还是一个循环还是只做一个 if 语句?
    • 这可能是视图模型上的 bool 属性和视图中的 if (尽管 ? : 可能更容易看到),或者如果这仍然太混乱,则接受部分视图里面有 if 的几个参数。我想这也取决于你如何编写它;如果您在链接本身中有一个 onclick 属性(这不是推荐的方式),您可以将它放在另一个属性(可能是元组或其他东西)中,或者正确的方式,即将所有脚本放在一个单独的.js 文件。在这种情况下,脚本可以只检查链接是否存在。
    【解决方案3】:

    我会通过在会员提供者下创建角色来解决这个问题。然后,您可以按照以下方式装饰整个控制器或其中的操作:

    [Authorize(Roles = "Premium")]
    public virtual ActionResult ShowPremiumContent()
    {
        return View();
    }
    

    网上有一些很好的资源可以为同一个最终游戏提供不同的方法:

    Restrict Area to a given role

    http://weblogs.asp.net/srkirkland/archive/2010/01/04/authorizing-access-via-attributes-in-asp-net-mvc-without-magic-strings.aspx

    http://geekswithblogs.net/thomasthedeuce/archive/2009/06/25/133056.aspx

    【讨论】:

    • 我将毫无顾忌地使用 Authorize 属性,但我不知道这是否能解决我的问题(至少不是我想要的方式)。例如,我有一个对话框,其中的表单拆分为选项卡(尽管它们都采用相同的形式)。免费帐户可能会少看到一个选项卡,但在提交时,它将全部转到同一个控制器,减去免费帐户中不存在的选项卡的信息。因此,如果我放置了一个需要高级帐户的授权标签,那么我将需要采取行动方法将其发送到正确的区域(一个免费,一个高级)。这是我现在不想做的事情............
    • 我需要一些逻辑来确定通过 ajax 发送它的操作方法。我可能需要将这些部分提取到他们自己的脚本中并对其进行更改并在帐户加载时加载正确的脚本等等。
    • chobo2 - 明白了。所以你真的需要一个接口(我的意思是代码接口而不是具体的强类型类)在控制器/服务级别区分免费和高级。我还认为带有角色检查的 html 助手可能是一个很好的途径,也许是一个检查服务类中角色的代码实现
    • @jim - 你能详细说明一下界面吗?在视图中看起来如何?你是说做虚拟机的接口吗?
    猜你喜欢
    • 1970-01-01
    • 2020-06-03
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    相关资源
    最近更新 更多