Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
4.1k views
in Technique[技术] by (71.8m points)

c# - Correctly override the generic BaseController

I have the generic BaseController like this:

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

Do I correctly override this action in the derived controller class

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

Especially, should I reuse the method attributes(like ValidateAntiForgeryToken), and will the binding Bind work in that case?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Method attributes do not need to be reused on the overriden method:

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

The binding Bind will work in the overrided method. You will need to mark the base controller as abstract, otherwise ASP.NET Core does not know, which controller and endpoint to choose and throws an exception:

Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException: The request matched multiple endpoints


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...