asp.net-mvc – 在MVC WebApi中的方法如何映射到http动词?
在下面链接的5分钟视频中,在1:10标记,Jon Galloway说,添加一个名为DeleteComment的方法到他的CommentsController控制器类将按照惯例映射到删除http动词。
MVC与WebApi如何知道如何解决方法到正确的动词?我知道global.asax.cs文件中的路由将请求路由到正确的控制器,但是删除请求如何“按惯例映射”到删除方法或任何方法?特别是当每个动词可以有超过1个方法时? “按照惯例”让我认为它只是看着方法名称中的第一个单词…但是如果是这样,它将必须读取方法的签名告诉两个删除方法或两个get方法分开…和是这个定义吗? 视频: 谢谢! 编辑: // GET /api/values public IEnumerable<string> Get() { return new string[] { "value1","value2" }; } // GET /api/values/5 public string Get(int id) { return value; } 解决方法
我提前道歉,这个帖子偏离了你的问题,但所有这些冒出来,当我阅读你的问题。
WebAPI匹配语义 >它匹配动作的名称与动词(verb = GET?查找以“get”开头的方法名称) 因此,在您的代码示例中,没有参数的GET请求与没有参数的Get *()函数匹配。 Get包含和ID寻找Get ***(int id)。 例子 奇怪的名称 – 你的get方法可以命名任何东西,只要它以“get”开头。所以在widget控制器的情况下,你可以命名你的函数GetStrawberry(),它仍然会匹配。把匹配想象为:methodname.StartsWith(“Get”) 多个匹配方法 – 如果有两个没有参数的Get方法会发生什么? GetStrawberry()和GetOrange()。最好的我可以告诉,函数定义第一(文件的顶部)在你的代码中赢得…奇怪。这有副作用,使一些方法在您的控制器不可达(至少与默认路由)….陌生人。
该怎么办? 作为一个实用主义者,我怀疑许多API将是70%的RESTful,有一些微小的RPC风格方法。首先,控制器增殖单独(给定webapi绑定方法)将驱动开发人员bonkers。第二,WebAPI真的没有一个内置的方式来创建api路径的嵌套结构(意思是:/ api / controller /很容易,但/ api / CATEGORY / Sub-Category / Controller是可行的,但是痛苦)。 从我的角度来看,我很想看到webAPI文件夹结构控制默认的API路径…意思如果我在我的UI项目中创建一个类别文件夹,那么/ api / Category将是默认路径(parallel to this MVC article)。 我做了什么? // SEE NOTE AT END ABOUT DataToken change from RC to RTM Route r; r = routes.MapHttpRoute( name : "Category1",routeTemplate : "api/Category1/{controller}/{id}",defaults : new { id = RouteParameter.Optional } ); r.DataTokens["Namespaces"] = new string[] {" UI.Controllers.Category1"}; r = routes.MapHttpRoute( name : "Category2",routeTemplate : "api/Category2/{controller}/{id}",defaults : new { id = RouteParameter.Optional } ); r.DataTokens["Namespaces"] = new string[] {" UI.Controllers.Category2"}; routes.MapHttpRoute( name : "ApiAllowingBL",routeTemplate : "api/{controller}/{action}/{id}",defaults : new { id = RouteParameter.Optional } ); routes.MapHttpRoute( name : "DefaultApi",routeTemplate : "api/{controller}/{id}",defaults : new { id = RouteParameter.Optional } ); >前两个路由创建“子文件夹”路由。我需要为每个子文件夹创建一个路由,但我限于自己的主要类别,所以我最终只有3-10。注意这些路由如何添加Namespace数据令牌,以限制搜索特定路由的类。这很好地对应于在向UI项目添加文件夹时的典型命名空间设置。 另一种说法 >我在我的UI项目中创建一个文件夹(让我们说Category1),并将api控制器放在该文件夹中。
r.AddRouteToken("Namespaces",new string[] {"UI.Controllers.Category1"}); private static Route AddRouteToken(this Route r,string key,string[] values) { //change from RC to RTM ...datatokens is null if (r.DataTokens == null) { r.DataTokens = new RouteValueDictionary(); } r.DataTokens[key] = values; return r; }
private static IHttpRoute MapHttpRoute(this HttpRouteCollection routes,string name,string routeTemplate,object defaults,object constraints,string[] namespaceTokens) { HttpRouteValueDictionary defaultsDictionary = new HttpRouteValueDictionary(defaults); HttpRouteValueDictionary constraintsDictionary = new HttpRouteValueDictionary(constraints); IDictionary<string,object> tokens = new Dictionary<string,object>(); tokens.Add("Namespaces",namespaceTokens); IHttpRoute route = routes.CreateRoute(routeTemplate,defaultsDictionary,constraintsDictionary,dataTokens: tokens,handler:null); routes.Add(name,route); return route; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-web-api – 我什么时候应该在Web api中使用HttpReq
- asp.net-mvc-3 – 在IIS 7.5上托管MVC应用程序时显示完整的
- 在asp.net ajax工具包中组合脚本
- asp.net-mvc – 如何将模型中的占位符文本添加到MVC视图中?
- 如何在ASP.NET应用程序中创建类的实例
- asp.net-mvc – 授权标签如何工作? – Asp.net Mvc
- asp.net-mvc – 在HTML表单上的ASP.NET MVC中的PUT或DELETE
- asp.net – 从aspx页面中的Static方法访问ViewState
- asp.net – IIS 8.5提供旧文件
- asp.net-core – ASP.NET Core WebAPI默认路由不起作用