以下是我的WebApiConfig文件的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace HotelManagementSystem
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
//routes.MapHttpRoute("RestApiRoute", "Api/{controller}/{id}", new { id = RouteParameter.Optional }, new { id = @"\d+" }); //this replaces your current api route
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
}
我面临很多问题而且我被告知我的代码是正确的,我的问题在于此文件。伙计我的问题是link,请指导我应该做出哪些改变。
即使以下设置也不起作用:
答案 0 :(得分:1)
根据你的链接问题,你在API端点中得到null,因为你已经通过说NULL
将参数声明为可选参数,默认为string a = null
。
现在你的第二个问题:为什么参数没有被绑定;因为您声明的路线是默认路线,如下所示
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
并在下面观察您的请求
$.ajax({
url: "/api/Booking/lander",
method: "post",
data: { a: ab } <-- this part
})
它没有自动绑定的唯一原因是,您的路径将参数名称指定为id
,但您的参数名称为a
。
您应该为此声明一个单独的路线,如
config.Routes.MapHttpRoute(
name: "lander",
routeTemplate: "api/Booking/lander/{a}",
defaults: new {controller = "lander", a = RouteParameter.Optional }
);
答案 1 :(得分:1)
实际上这里有几个问题。
您的AJAX请求是HTTP Post请求。在AJAX Post请求中,默认情况下,请求的有效负载(或数据)在请求的正文中发送。这意味着您的{ a: ab }
将不会像HTTP Get请求中那样成为URL的一部分(在这种情况下,它将作为查询字符串参数附加到URL的末尾:?a=Chocolate Smoothies ya know
)。
在ASP.NET MVC和WebAPI中,路由仅受请求URL的影响,而不受请求体的影响,因此您无需在路由模板中定义映射到api/Booking/lander
路由的参数。像这样的路线应该足够了:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}"
);
现在,如果你没有在路由模板中指定它,你的行动将如何知道查找a
参数的位置,对吧?好吧,你只需要告诉它查看请求的正文。这是使用[FromBody]
属性完成的,如下所示:
[HttpPost]
public void lander([FromBody]string a)
现在,这告诉请求的主体 IS 参数a
。因此,您的AJAX调用需要发送string
,而不是包含string
的对象(因为它不再是对象,而是纯字符串,您需要指定正确的{ {1}}服务器正确解析它:
contentType
为了完整性:如果您仍希望AJAX调用中的$.ajax({
url: "/api/Booking/lander",
method: "post",
contentType: "application/json",
data: ab
})
保持为对象(data
),则需要为该数据定义自定义模型类型:
{ a: ab }
然后将其用作public class LanderData {
public string a { get; set; }
}
操作中参数的类型:
lander
[HttpPost]
public void lander([FromBody]LanderData data)
属性实际上是[FromBody]
操作中的默认属性,因此它不是必需的。在任何情况下,明确都不会伤害。
请注意,当以字符串而不是对象发送数据时,您需要确保将其序列化为有效的JSON字符串。为此,您需要将字符串括在另外一对单引号中,如[HttpPost]
中所示。这样,您的请求正文将是'"Chocolate Smoothies ya know"'
,这是一个有效的JSON字符串,而在前一种情况下,它是"Chocolate Smoothies ya know"
,而不是。{/ p>
答案 2 :(得分:0)
行routeTemplate: "api/{controller}/{action}/{id}",
应更改为routeTemplate: "Api/{controller}/{id}",