ABP理论学习之MVC控制器(新增)

时间:2023-12-21 17:31:44

返回总目录


本篇目录

介绍###

ABP通过Abp.Web.Mvc nuget包集成了ASP.NET MVC控制器。你可以像常规那样创建MVC控制器。依赖注入对于常规的MVC控制器可以正确地工作。

但是,你应该让你的控制器继承于AbpController,该基类控制器提供了很多有用的东西,而且更好地集成到了ABP中。

AbpController基类

下面是一个派生自AbpController的简单控制器:

public class HomeController : AbpController
{
public ActionResult Index()
{
return View();
}
}

本地化

AbpController中定义了L方法使得本地化更加简单。例子:

public class HomeController : AbpController
{
public HomeController()
{
LocalizationSourceName = "MySourceName";
} public ActionResult Index()
{
var helloWorldText = L("HelloWorld"); return View();
}
}

要使L方法生效,必须设置LocalizationSourceName。你可以在自己的控制器基类中设置而不用在每个控制器中都重复设置。

异常处理

异常都是自动处理的,自动记录日志,而且会给客户端返回一个合适的响应。

查看异常处理博客获得更多信息。

响应结果的包装

如果返回类型是JsonResult(或者异步action方法的Task),ABP会默认封装该action方法的响应结果。你可以通过为控制器或者actions使用WrapResult和DontWrapResult特性来更改默认的封装(注意:以前有园友经常问到这个)。

查看ajax博客获取更多信息。

审计日志

如果你从AbpController派生控制器的话,那么审计日志会自动记录。

查看审计日志博客获取更多信息。

授权

你可以为控制器或者action方法使用AbpMvcAuthorize特性来阻止未授权的用户使用控制器和action方法。例子:

public class HomeController : AbpController
{
[AbpMvcAuthorize("MyPermissionName")]
public ActionResult Index()
{
return View();
}
}

AbpApiController也定义了检查权限的IsGranted方法作为快捷方式。请查看授权一节获取更多信息。

工作单元

MVC的action方法默认不是工作单元。例如,如果你需要在action方法中打开数据库连接,就需要像下面那样声明UnitOfWork特性:

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);
}
}

这里我们声明了UnitOfWork特性。因为仓储的 GetAll()方法返回了 IQueryable,而当它使用 ToList()方法(由于IQueryable的延迟执行)时需要一个打开的数据库连接,所以这里需要声明该特性。注意该action方法应该声明为virtual(否则拦截无法工作)。

请查看工作单元获取更多。

其他

你还可以使用预注入的 AbpSession, EventBus, PermissionManager, PermissionChecker, SettingManager, FeatureManager, FeatureChecker, LocalizationManager, Logger, CurrentUnitOfWork等基属性以及更多。

要了解以上属性,请查阅其他相应博客。