## 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 等基础属性。
- 文章&教程
- Abp
- 1.1ABP总体介绍-入门介绍
- 1.2ABP总体介绍-多层架构体系
- 1.3ABP总体介绍-模块系统
- 1.4ABP总体介绍-启动配置
- 1.5ABP总体介绍-多租户
- 1.6ABP总体介绍-集成OWIN
- 2.1ABP公共结构-依赖注入
- 2.2ABP公共结构-会话管理
- 2.3ABP公共结构-缓存管理
- 2.4ABP公共结构-日志管理
- 2.5ABP公共结构-设置管理
- 2.6ABP公共结构-时区设置
- 3.1ABP领域层-实体
- 3.2ABP领域层-值对象
- 3.3ABP领域层-仓储
- 3.4ABP领域层-领域服务
- 3.5ABP领域层-工作单元
- 3.6ABP领域层-领域事件
- 3.7ABP领域层-数据过滤器
- 4.1ABP应用层-应用服务
- 4.2ABP应用层-数据传输对象
- 4.3ABP应用层-数据传输对象验证
- 4.4ABP应用层-权限认证
- 4.5ABP应用层-功能管理
- 4.6ABP应用层-审计日志
- 5.1ABP分布式服务-ASP.NET WebApi
- 5.2ABP分布式服务-动态WebApi层
- 5.3ABP分布式服务-集成OData
- 5.4ABP分布式服务-集成SwaggerUI
- 6.1ABP表现层-Mvc控制器
- 6.2ABP表现层-Mvc视图
- 6.3ABP表现层-本地化
- 6.4ABP表现层-导航栏
- 6.5ABP表现层-异常处理
- 6.6.2-AJAX
- 6.6.3-Notification
- 6.6.4-Message
- 6.6.5-UIBlockBusy
- 6.6.6-EventBus
- 6.6.7-Logging
- 6.6.8-OtherUtilities
- 6.6ABP表现层-JavascriptAPI
- 6.7ABP表现层-嵌入资源文件
- 6.8ASP.NET-Core
- 6.9CSRF和XSRF保护
- 7.1ABP后台服务-后台作业和工人
- 7.2ABP后台服务-集成Hangfire
- 8.1ABP实时服务-通知系统
- 8.2ABP实时服务-集成SignalR
- 9.1ABP基础设施层-集成Entity Framework
- 9.2ABP基础设施层-集成NHibernate
- 9.3ABP基础设施层-集成Entity Framework Core
- abp合并版160929
- md文档排版规范
- AbpZero
- 1.1ABPZero-概述
- 1.2ABPZero-安装
- 1.3ABPZero-启动模板
- 1.4ABPZero-启动模板Core
- 2.1ABPZero-多租户管理
- 2.2ABPZero-版本管理
- 2.4ABPZero-组织单位管理