ASP.NET Core中CRUD调用的有效关键字及路由映射疑问
ASP.NET Core中CRUD调用的有效关键字及路由映射疑问
我来帮你理清这个困惑,其实核心是ASP.NET Core里的两种路由匹配逻辑在起作用——属性路由和约定路由,咱们一步步拆解:
首先,你代码里的[HttpPost]属性是关键,它属于属性路由的范畴:
- 当你给控制器方法加上
[HttpPost]这类HTTP动词属性时,框架会直接根据这个属性来匹配请求,完全不关心方法名叫什么。 - 假设你的控制器是
PizzaController,ASP.NET Core默认会给控制器加上路由前缀/pizza(控制器名去掉Controller后缀)。所以[HttpPost]就会把所有发送到http://localhost:5000/pizza的POST请求,绑定到这个方法上——不管方法名是Create、AddPizza还是别的什么,都不影响匹配。
然后你提到的“用Get/Post作为方法名自动映射”,这是约定路由的规则:
- 这种方式是早期ASP.NET MVC的遗留约定,当你不给方法加任何HTTP属性时,框架会根据方法名的前缀来推断要处理的HTTP动词:比如
Get()、GetPizzaById()这类以Get开头的方法,默认处理GET请求;Post()、PostPizza()处理POST请求,以此类推。 - 但这种约定的优先级低于属性路由,也就是说如果方法加了
[HttpPost],不管方法名是不是Post开头,都会优先遵循属性的配置。
回到你的疑问:为什么没找到关于Create方法的文档?因为Create只是你自定义的方法名,框架根本不依赖这个名字来做路由匹配,真正起作用的是[HttpPost]属性。你完全可以把方法名改成Add,只要保留[HttpPost],POST到/pizza的请求依然会被这个方法处理。
总结一下:
- 想显式控制路由和HTTP动词,用
[HttpGet]/[HttpPost]这类属性路由,方法名随意取; - 想依赖命名约定省掉属性,就用
Get/Post/Put/Delete开头的方法名,但这种方式灵活性差一些,Web API开发中更推荐属性路由。
备注:内容来源于stack exchange,提问作者KeithViking
相关产品推荐
相关产品推荐

