【问题标题】:Using attribute routing on a controller is forcing me to manage all routes在控制器上使用属性路由迫使我管理所有路由
【发布时间】:2016-12-19 10:30:37
【问题描述】:

我刚刚开始掌握 Asp.net Core,我正在尝试建立一个基本站点。

我想在子目录下构建一个管理面板。

我有一个由 EF crud 功能搭建的简单控制器。

因此,从示例看来,我应该能够将[Route()] 属性添加到控制器,它将为所有内容添加前缀。像这样的:

[Route("Admin/Subfolder/[controller]")]
public class EventsController : Controller
{
}

但是当我这样做时,我只是得到一个错误页面,上面写着“多个操作匹配”,它列出了索引、详细信息、创建等。

如果我然后遍历所有方法并在其上添加[Route()] 属性,我可以让它工作,但这似乎不符合文档。

感觉我应该能够只为控制器路由添加一个前缀,而不必接管控制器内每条路由的管理。举个例子,POSTS 现在不起作用,我不确定路由属性的格式应该是什么。

我做错了什么?

【问题讨论】:

    标签: asp.net-core attributerouting


    【解决方案1】:

    你做得对。默认路由属性可以在控制器级别应用。 “在控制器上放置一个路由属性使得控制器中的所有动作都使用属性路由。” 您可以发布控制器的完整代码吗?里面一定有其他事情发生。确保对具有相同名称的操作使用 HttpPost/HttpGet 属性,如下所示:

    [Route("Admin/Subfolder/[controller]")]
    public class EventsController : Controller
    {
        [HttpGet]
        public IActionResult NewEvent()
        { }
    
        [HttpPost]
        public IActionResult NewEvent()
        { }
    }
    

    关于路由的很好的解释可以找到here

    【讨论】:

    • 谢谢你,从你的 cmets 我得到了这个工作。我需要像[HttpGet("Edit/{id}")][HttpPost("Edit/{id}")] 这样的东西来完成每个动作。我现在看到它在文档中明确指出,如果我在任何东西上使用属性路由,那么它必须为所有东西完成。我认为它仍然会根据名称选择一个合理的默认值。
    • 我现在意识到我实际上可以使用[HttpGet("[action]/{id}")],但我仍然感到失望的是,如果我不指定它,它不仅仅从动作名称和参数中找出来。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 2016-04-05
    相关资源
    最近更新 更多