正确覆盖通用 BaseController

时间:2021-01-16 11:24:27

标签: c# .net asp.net-core asp.net-mvc-controller asp.net-core-5.0

我有这样的通用 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 是否有效?

1 个答案:

答案 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: 请求匹配多个端点

相关问题