【发布时间】:2018-07-15 23:31:37
【问题描述】:
我有一个通用控制器,它有几个派生的控制器类。但我不知道如何处理 HttpGet 的 路由名称,因为它需要常量。
[HttpGet("{id}", Name ="should not hard coded here for derived class")]
public virtual async Task<IActionResult> Get(int id)
我需要路由名称,因为在我的 HttpPost 函数中,我想返回需要 HttpGet 的 路由名称
的 CreatedAtRoute()路由名称不能硬编码,因为所有派生类都需要有不同的路由名称。
这是基本控制器
public abstract class BaseController<TEntity, TContext> : Controller where TEntity : BaseOptionType, new() where TContext : DbContext
{
private readonly IGenericRepository<TEntity, TContext> _repository;
private readonly ILogger<BaseGenericOptionTypesController<TEntity, TContext>> _logger;
public BaseController(IGenericRepository<TEntity, TContext> repository, ILogger<BaseController<TEntity, TContext>> logger)
{
_repository = repository;
_logger = logger;
}
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[HttpGet("{id}", Name = "should not hard code here for derived class")]
public virtual async Task<IActionResult> Get(int id)
{
var optionType = await _repository.FindByIdAsync(id);
if (optionType == null)
{
_logger.LogInformation($"[ID not found]");
return NotFound();
}
return Ok(optionType);
}
}
这是派生控制器
[Route("api/v1/DerivedControllerA")]
public class DerivedControllerA : BaseController<TimeOff, HRContext>
{
public DerivedControllerA(IGenericRepository<TimeOff, HRContext> repository, ILogger<DerivedControllerA> logger)
: base(repository, logger)
{
}
}
任何帮助将不胜感激,谢谢。
【问题讨论】:
-
这是一个 XY 问题。你应该never use a base controller in MVC。见Cross-Cutting Concerns。
标签: c# asp.net-core-mvc asp.net-core-webapi asp.net-core-routing