我有这样的通用 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
是否有效?
答案 0 :(得分:1)
方法属性不需要在被覆盖的方法上重用:
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
将在被覆盖的方法中工作。您需要将基本控制器标记为抽象,否则 ASP.NET Core 不知道选择哪个控制器和端点并抛出异常:
Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException: 请求匹配多个端点