【问题标题】:using a base controller for entire asp.net MVC 4 project为整个 asp.net MVC 4 项目使用基本控制器
【发布时间】:2013-03-02 12:45:06
【问题描述】:

我正在考虑为我正在处理的整个 MVC 4 项目使用基本控制器。我在网上发现了关于它的相互矛盾的观点,并且不确定这是否违反最佳实践,或者这只是个人喜好问题。

这是一个 stackoverflow 帖子,上面写着dont do it

Here 是一个帖子,它展示了如何做到这一点,就像它没有有害影响一样。 Herehere 也解释了它的用法,没有人真正指出这是不好的做法或可能导致任何问题。

那么,在 MVC 4 项目中使用几个基本控制器的真正观点是什么?好的?坏的?

编辑

我还想指出,我使用基本控制器的直接目标是,我可以在一个控制器中完成授权,并且所有控制器都不需要具有 Authorize 属性。我将为每个角色创建单独的基本控制器。由于角色永远不会改变,我永远不需要为另一个角色创建另一个基本控制器。您如何看待这种设计控制器的方式?

感谢您的宝贵时间。

【问题讨论】:

    标签: .net asp.net-mvc inheritance


    【解决方案1】:

    恕我直言,您引用的帖子说的是绝对正确的,但这不是不使用基本控制器的理由。事实上,由于商品原因,我在一些 ASP.NET MVC 应用程序中使用了基本控制器。

    这不再是可取的:

    有一个基本控制器来应用一次 [Authorize] 属性是一种常见的做法,我认为它没有任何问题。

    从 MVC3 开始,您可以像这样注册全局操作过滤器:

    GlobalFilters.Filters.Add(new MyAuthorizeAttribute());

    【讨论】:

    • 感谢您的回复。你会认为拥有多个角色是个问题吗?然后对于每个角色,我都需要一个单独的控制器。一个用于管理员的基本控制器。因此,仅管理员页面仅从该特定控制器继承。其他角色也是如此..
    • 如果控制器的所有操作都被授权用于相同的角色,我认为为每个角色使用单独的基本控制器不会有问题。但是,如果您的控制器具有授权给一组角色的操作和授权给另一组角色的其他操作,那么您应该尝试另一种方法。
    【解决方案2】:

    在处理诸如覆盖 User 主体之类的事情之前,我曾使用过基本控制器(请参阅此处了解我描述该想法的一个老问题:Is this Custom Principal in Base Controller ASP.NET MVC 3 terribly inefficient?)。

    老实说,我想不出更好的方法来做到这一点,所以我觉得在这种情况下使用基本控制器可能是一件好事。

    我可能不会为不同的授权角色使用不同的基本控制器,因为只需用[Authorize(Roles="whatever")] 装饰控制器就相当简单(而且代码更少),而且更容易看到到底发生了什么。

    可能值得考虑自定义AuthorizeAttribute

    【讨论】:

    • 看就是这样。我试图避免用 authorize 属性装饰每个控制器。我只是想让初级开发人员知道,如果他们正在处理只有管理员可以访问的页面,那么他们应该从 AdminController 继承。我将枚举这些角色中的每一个,管理员在列表中排名第一。所以在我的自定义授权属性中,我只能检查大于或小于基本控制器提供的枚举值
    • 如果您对允许哪些角色执行哪些操作有复杂的要求,则可能会出现问题。我说的是以后需求是否发生变化。用某种自定义 AuthorizateAttribute 装饰控制器可能会更好(请参阅编辑答案中的链接)。
    • 谢谢。会检查的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多