本篇目錄
介紹###
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
查看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等基屬性以及更多。
要了解以上屬性,請查閱其他相應博客。