在整个ASP.NET MVC 4项目中使用基础控制器

9
我在考虑为整个MVC 4项目使用基本控制器。我在网上找到了一些有关此问题的不同观点,但并不确定它是否违反最佳实践,或者仅仅是个人偏好的问题。 这里有一个StackOverflow帖子说不要这样做这篇文章展示了如何这样做,没有任何负面影响。这里这里也解释了它的用法,没有人真正指出这是不好的做法,或者会导致任何未来的问题。 那么,在MVC 4项目中使用一些基本控制器的看法究竟是什么?好?坏? 我还想指出,我使用基本控制器的直接目标是为了让我可以在一个控制器中完成授权,并且所有控制器都不需要具有Authorize属性。我将为每个角色创建单独的基础控制器。由于角色永远不会改变,我永远不需要为另一个角色创建另一个基础控制器。您认为这种设计控制器的方式怎么样?谢谢您的时间。
2个回答

4

我认为你所引用的帖子说得很对,但这并不是不使用基础控制器的理由。事实上,出于方便考虑,我在我的一些ASP.NET MVC应用程序中使用基础控制器。

然而,现在不再建议这样做:

使用基础控制器一次性应用[Authorize]属性是一种常见做法,我认为这没有任何问题。

自MVC3以来,您可以像这样注册全局操作过滤器:

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


谢谢您的回复。您认为拥有多个角色会成为问题吗?那么对于每个角色,我都需要一个单独的控制器。一个基础控制器用于管理员。这样只有管理员页面才从该特定控制器继承。其他角色也是如此。 - user20358
如果控制器的所有操作都针对相同的角色进行授权,那么为每个角色使用单独的基本控制器应该没有问题。 但是,如果您有控制器的某些操作仅授权给一组角色,而其他操作则授权给另一组角色,那么您可能应该尝试另一种方法。 - eiximenis

3

之前在处理类似于覆盖 User 主体时,我曾经使用过基本控制器(参见我的旧问题描述想法: Is this Custom Principal in Base Controller ASP.NET MVC 3 terribly inefficient?)。

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

我可能不会为不同的授权角色设置不同的基本控制器,因为只需向控制器添加 [Authorize(Roles="whatever")] 就可以了,这样更简单(并且代码更少),而且可以更容易地看到正在发生什么。

值得考虑自定义的AuthorizeAttribute


看,这就是问题所在。我试图避免在每个控制器上都使用authorize属性进行装饰。我只想让初级开发人员知道,如果他们正在处理只有管理员才能访问的页面,则应该从AdminController继承。我会枚举出这些角色中的每一个,其中管理员在列表中排名第一...因此,在我的自定义授权属性中,我只能检查基础控制器提供的枚举值的大小关系。 - user20358
如果您对哪些角色可以执行哪些操作有复杂的要求,可能会出现问题。我指的是如果要求以后发生变化。在控制器上装饰一些自定义的AuthorizateAttribute可能更好(请参见编辑答案中的链接)。 - Tom Chantler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,