繁体   English   中英

Web api 路由前缀与 controller 操作名称

[英]Web api route prefixes with controller action names

我有一个 asp.net 核心 3.1 应用程序。 在启动文件中,我有以下路线。

  app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller}/{action}/{id?}",
                defaults: new { controller = "Home", action = "Index" });
            endpoints.MapControllers();
            endpoints.MapRazorPages();
        });

我有 position controller 索引和详细信息视图。

 public class PositionController : Controller
{
    private readonly IPositionRepository repository;

    public Position Position { get; set; }

    public PositionController(IPositionRepository repository)
    {
        this.repository = repository;
    }
    
    public IActionResult Index()
    {
        return View();
    }

    public async Task<IActionResult> Details(int id)
    {
        if (id < 0)
            return View();

        Position = await repository.FindPositionById(id);

        if (Position == null)
           return RedirectToAction("_NotFound");

        return View(Position);
    }

索引视图指向 https://localhost:44356/Position,详细视图指向 https://localhost:44356/Position/1。 (位置的 id=1)

我有一个 web api 使用 Get 和 GetTaskGroups 操作获取所有位置数据。

[Produces("application/json")]
[Route("api/positions")]
[ApiController]
public class PositionsController : Controller
{
    private readonly IPositionRepository repository;

    public PositionsController(IPositionRepository repository)
    {
        this.repository = repository;
    }

    [HttpGet]
    public async Task<IActionResult> Get()
    {
        return Json(new { data = await repository.GetPositions() },
            new JsonSerializerSettings() { MetadataPropertyHandling = MetadataPropertyHandling.Ignore 
                         });
    }

    [HttpGet("{posId}/tasks")]
    public async Task<IActionResult> GetTaskGroups(int posId)
    {
        return Json(new { data = await repository.GetTaskGroups(posId) });
    }

我正在使用 jQuery ajax 调用获取数据,如下所示。

function loadPositions() {
positions =
    $('#positionsList').DataTable({
        "ajax": {
            "url": "api/positions",
            "type": "get",
            "datatype": "json"
        },...

function loadTaskGroups(posId) {
taskGroups =
    $('#taskGroups').DataTable({
        "ajax": {
            "url": `/api/positions/${posId}/tasks`,
            "type": "get",
            "datatype": "json"
        },...

我可以为索引视图获取数据,但不能为详细信息视图获取数据。 The web api route points to https://localhost:44356/Position/Details/1/api/positions/1/tasks which should point to https://localhost:44356/api/positions/1/tasks. 原因是我使用以下路线为索引视图获取数据 https://localhost:44356/api/positions/

我认为,问题与默认路由有关。 url 中不会显示索引视图,但会显示详细信息视图。

使用您的代码,我确实重现了您的问题。

只需在loadTaskGroups方法中删除ajax url中的/即可。

function loadTaskGroups(posId) {
taskGroups =
    $('#taskGroups').DataTable({
        "ajax": {
            "url": `api/positions/${posId}/tasks`,
            "type": "get",
            "datatype": "json"
        },...

这是测试结果:

在此处输入图像描述

试试看

function loadPositions() {
positions =
    $('#positionsList').DataTable({
        "ajax": {
            "url": "/api/positions",
            "type": "get",
            "datatype": "json"
        },...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM