🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 6.1 ABP表现层 - Mvc Controllers ### 6.1.1 简介 ABP已经把 **ASP.NET MVC Controllers** 集成到了 **Abp.Web.Mvc** 中,正如你一直那样做的,你可以使用常规的MVC Controllers。 [依赖注入](225827)可以解析常规的MVC Controllers。 但是你的Controllers应该从 **AbpController** 派生,因为在该基类中ABP已经提供了一些有用的便利方法。 #### 6.1.2 AbpController 基类 下面是一个简单的派生自AbpApiController的示例代码: ```csharp public class HomeController : AbpController { public ActionResult Index() { return View(); } } ``` #### 1. 本地化 为了使本地化更简单,ABP在AbpController中定义了一个 **L** 方法。示例如下: ```csharp public class HomeController : AbpController { public HomeController() { LocalizationSourceName = "MySourceName"; } public ActionResult Index() { var helloWorldText = L("HelloWorld"); return View(); } } ``` 为了能够使用 **L** 方法,首先我们应该初始化 **LocalizationSourceName**。当然,为了不重复初始化该变量,我们可以定义一个继承自AbpController的基类,在该类中初始化它,以后所有的Controller类都继承自该基类。 #### 2. 异常处理 异常是自动被处理的,会被记录到日志并且以一个适当的方式返回到客户端。详情请参考[异常处理](225854)。 #### 3. 包装返回内容 如果返回的类型是 **JsonResult** (或者异步Action的Task<JsonResult>)ABP默认会将Action的返回内容进行包装。你可以改变这个,只要在Controller的Action上面使用特性:**WrapResult** 或者 **DontWrapResult**,详情请参考[Javascript函数库](6.6ABP表现层-Javascript函数库.md) #### 4. 审计日志 如果派生自AbpController,那么日志会被自动记录。详情请参考[审计日志](225845)。 #### 5. 权限认证 你可以用 **AbpMvcAuthorize** 特性来阻止未授权的用户来访问你的Controllers和Actions。 示例如下: ```csharp public class HomeController : AbpController { [AbpMvcAuthorize("MyPermissionName")] public ActionResult Index() { return View(); } } ``` AbpController也定义了一个快速检测权限的方法 **IsGranted**。 详情请参照[权限认证](225843)。 #### 6. 工作单元 MVC Action默认是没有开启工作单元模式的。如果需要开启工作单元,你需要在Action上添加 **UnitOfWork** 的特性,如下所示: ```csharp public class HomeController : AbpController { private readonly IRepository<User, long> _userRepository; public HomeController(IRepository<User, long> userRepository) { _userRepository = userRepository; } [UnitOfWork] public virtual ActionResult Users(string filter) { var users = _userRepository .GetAll() .Where(u => u.UserName.StartsWith(filter)) .ToList(); return View(users); } } ``` 由于仓储的 **GetAll()** 方法返回的是 **IQuerable** 类型,在调用 **ToList()** 方法的时候需要连接数据库(这是由于IQuerable的延迟执行特性所决定的)。 >注意:使用 **UnitOfWork** 特性的方法,该方法必须是virtual的,否则拦截器将不能使用。 详情请参照[工作单元](3.4ABP领域层-工作单元.md)。 ### 6.1.3 其他 你也可以(pre-inijected)预先注入 AbpSession, EventBus, PermissionManager, PermissionChecker, SettingManager, FeatureManager, FeatureChecker, LocalizationManager, Logger, CurrentUnitOfWork 等基础属性。