6.1 ABP表现层 - Mvc Controllers

6.1.1 简介

ABP已经把 ASP.NET MVC Controllers 集成到了 Abp.Web.Mvc 中,正如你一直那样做的,你可以使用常规的MVC Controllers。
依赖注入可以解析常规的MVC Controllers。

但是你的Controllers应该从 AbpController 派生,因为在该基类中ABP已经提供了一些有用的便利方法。

6.1.2 AbpController 基类

下面是一个简单的派生自AbpApiController的示例代码:

  1. public class HomeController : AbpController
  2. {
  3. public ActionResult Index()
  4. {
  5. return View();
  6. }
  7. }

1. 本地化

为了使本地化更简单,ABP在AbpController中定义了一个 L 方法。示例如下:

  1. public class HomeController : AbpController
  2. {
  3. public HomeController()
  4. {
  5. LocalizationSourceName = "MySourceName";
  6. }
  7. public ActionResult Index()
  8. {
  9. var helloWorldText = L("HelloWorld");
  10. return View();
  11. }
  12. }

为了能够使用 L 方法,首先我们应该初始化 LocalizationSourceName。当然,为了不重复初始化该变量,我们可以定义一个继承自AbpController的基类,在该类中初始化它,以后所有的Controller类都继承自该基类。

2. 异常处理

异常是自动被处理的,会被记录到日志并且以一个适当的方式返回到客户端。详情请参考异常处理

3. 包装返回内容

如果返回的类型是 JsonResult (或者异步Action的Task)ABP默认会将Action的返回内容进行包装。你可以改变这个,只要在Controller的Action上面使用特性:WrapResult 或者 DontWrapResult,详情请参考Javascript函数库

4. 审计日志

如果派生自AbpController,那么日志会被自动记录。详情请参考审计日志

5. 权限认证

你可以用 AbpMvcAuthorize 特性来阻止未授权的用户来访问你的Controllers和Actions。
示例如下:

  1. public class HomeController : AbpController
  2. {
  3. [AbpMvcAuthorize("MyPermissionName")]
  4. public ActionResult Index()
  5. {
  6. return View();
  7. }
  8. }

AbpController也定义了一个快速检测权限的方法 IsGranted
详情请参照权限认证

6. 工作单元

MVC Action默认是没有开启工作单元模式的。如果需要开启工作单元,你需要在Action上添加 UnitOfWork 的特性,如下所示:

  1. public class HomeController : AbpController
  2. {
  3. private readonly IRepository<User, long> _userRepository;
  4. public HomeController(IRepository<User, long> userRepository)
  5. {
  6. _userRepository = userRepository;
  7. }
  8. [UnitOfWork]
  9. public virtual ActionResult Users(string filter)
  10. {
  11. var users = _userRepository
  12. .GetAll()
  13. .Where(u => u.UserName.StartsWith(filter))
  14. .ToList();
  15. return View(users);
  16. }
  17. }

由于仓储的 GetAll() 方法返回的是 IQuerable 类型,在调用 ToList() 方法的时候需要连接数据库(这是由于IQuerable的延迟执行特性所决定的)。

注意:使用 UnitOfWork 特性的方法,该方法必须是virtual的,否则拦截器将不能使用。

详情请参照工作单元

6.1.3 其他

你也可以(pre-inijected)预先注入 AbpSession, EventBus, PermissionManager, PermissionChecker, SettingManager, FeatureManager, FeatureChecker, LocalizationManager, Logger, CurrentUnitOfWork 等基础属性。