如何为类库中的筛选器/属性指定 MVC 控制器/操作

本文关键字:属性 MVC 操作 控制器 类库 筛选 | 更新日期: 2023-09-27 18:35:30

我很想听听是否有更好的方法来实现以下内容。我不想创建复杂或不可维护的代码。

我正在创建一个类库,该库将由未来的项目实现。该库包含几个从 ActionFilterAttribute 继承的筛选器/属性,实现应用程序可以使用这些筛选器/属性来修饰控制器或操作。

一个例子是 MustBeLoggedInAttribute。这将检查 cookie 以查看当前用户是否已登录。如果存在有效的 Cookie,则不会执行任何操作。如果没有有效的cookie,该属性将重定向到控制器和操作,例如AuthController> Login()。

因此,由于有一个实现类库的应用程序,我不知道应用程序要重定向到哪个控制器或操作。我想到了两种获取这些信息的方法。

  1. 获取实现应用以在其 web.config 中指定控制器和操作名称。

    我通过检查字符串名称都存在于实现应用程序的程序集中来验证字符串名称,否则尝试默认值,例如主页> Index()。这种方法似乎有很多缺点,包括

    • 降低实现应用程序的可维护性(更改控制器或操作名称也意味着更新 Web 配置)

    • 我必须验证字符串名称

    • 实现应用程序的开发人员需要阅读文档才能指定这一点

    • 可能还有更多负载

  2. 让筛选器/属性采用两个参数来指定控制器和操作

    这似乎也有一些第一个想法的缺陷,例如,如果名称被更改,则更新名称,但在整个实现应用程序中名称将重复的事实。

我觉得必须有一种更好的方法来做到这一点,这将使实现应用程序可维护,而不是重复代码,也不会太复杂。这是一厢情愿吗?

过滤器需要知道重定向到哪里,但最好的方法是什么?还是我应该以完全不同的方式执行此操作?实现应用程序是否应该实现自己的过滤器/属性,然后使用我的类库中的公共方法来执行 cookie 检查?有没有更好的方法?

我真的很感激人们对此的想法,因为我真的不想创建糟糕的代码。非常感谢!

如何为类库中的筛选器/属性指定 MVC 控制器/操作

你可以使你的操作过滤器抽象,并有一些 HandleUnauthorizedRequests 抽象方法,该方法将采用过滤器上下文。现在,实现应用程序将采用您的基本操作过滤器并编写一个派生的过滤器来实现抽象方法并改用此类。在这种方法中,它可以做任何它想做的事情 ->重定向,呈现视图,...

当然,您可以使用标准的常规内容提供一些默认实现,例如重定向到帐户/登录操作。想要超越这些传统东西的人总是可以做到的。这样,作为类库作者,您无需担心控制器是否存在 - 这是使用者的责任。

老问题,但这里有几个新选择:

使用选项 2,但不要单独应用于每个操作,而是创建一个基本控制器并将筛选器应用于该控制器。然后,该控制器和派生中的所有操作都需要通过您的过滤器。 将不需要传递的操作放入不是从筛选的基本控制器派生的其他控制器中。 可能不是一个选项,具体取决于您如何组织您的行动/路线等,但可能是最简单的。

或者,您可以让过滤器引发自定义异常,例如 MustBeLoggedInException,然后让您的全局 asax 以每个应用程序/实现所需的方式专门处理该错误。 更好地遵守单一责任原则:您的属性只是通知您的应用它尚未通过筛选器。 然后,您可以使用其他机制来处理该信息(例如全局错误处理程序中的重定向)。