c# - 正确覆盖通用 BaseController
问题描述
我有这样的通用 BaseController :
public class BaseController<T> : Controller where T : BaseEntity
{
protected readonly IRepository _repository;
public BaseController(IRepository repository)
{
_repository = repository;
}
// POST: TController/Create
[HttpPost]
[ValidateAntiForgeryToken]
public virtual async Task<IActionResult> Create(T item)
{
try
{
if (ModelState.IsValid)
{
await _repository.AddAsync(item);
}
return RedirectToAction(nameof(Index));
}
catch
{
return PartialView();
}
}
我是否在派生控制器类中正确覆盖了此操作
public class PaysController : BaseController<Pays>
{
public PaysController(IRepository repository): base(repository) { }
// POST: Pays/Create
[HttpPost]
[ValidateAntiForgeryToken]
public override async Task<IActionResult> Create([Bind("IDPays,Code,Nom")] Pays pays)
{
return await base.Create(pays);
}
特别是,我应该重用方法属性(如ValidateAntiForgeryToken
),Bind
在这种情况下绑定会起作用吗?
解决方案
方法属性不需要在被覆盖的方法上重用:
var attributes = typeof(PaysController).GetMethod("Create").GetCustomAttributes(false);
Debug.Assert(attributes.Any(x => x.GetType() == typeof(HttpPostAttribute)));
Debug.Assert(attributes.Any(x => x.GetType() == typeof(ValidateAntiForgeryTokenAttribute)));
绑定Bind
将在覆盖的方法中工作。您需要将基本控制器标记为abstract,否则 ASP.NET Core 不知道选择哪个控制器和端点并引发异常:
Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException:请求匹配多个端点
推荐阅读
- php - 远程网站 ALPN 支持检测
- r - 以 Group By 方式标记行
- bazel - 如何从下载的jar中提取资源
- python - 语法错误:非 UTF-8?
- swift - 调用中缺少参数“事实”的参数
- c++ - 如何使编译器根据版本跳过函数?
- java - 在带有 ActionListener 和 if-else 语句的 JFrame 上使用 JTextField、JButton 和 JLabels Jbutton 不起作用
- php - 如何从右到左str_split字符串?
- javascript - Node.js - 使用 ejs 的动态列表
- perl - 无法理解 Perl 哈希引用