提问人:Asbah Qadeer 提问时间:7/17/2017 最后编辑:Asbah Qadeer 更新时间:7/17/2017 访问量:3450
如何设置 WebApiConfig.cs?MVC的
How to set up WebApiConfig.cs? MVC
问:
以下是我的 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 }
);
}
}
}
我面临很多问题,我被告知我的代码是正确的,我的问题在于这个文件。伙计们,我的问题就在这个链接上,请指导我应该做出哪些改变。
即使以下设置也不起作用:
答:
该行应更改为routeTemplate: "api/{controller}/{action}/{id}",
routeTemplate: "Api/{controller}/{id}",
评论
{controller}
RouteConfig.cs
根据您的链接问题,您在 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 }
);
评论
实际上,这里有几个问题。
您的 AJAX 请求是 HTTP Post 请求。在 AJAX Post 请求中,默认情况下,请求有效负载(或数据)在请求的正文中发送。这意味着 your 不会像在 HTTP Get 请求中那样成为 URL 的一部分(在这种情况下,它将作为查询字符串参数附加到 URL 的末尾:)。{ a: ab }
?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)
现在,这告诉操作请求的正文是参数。因此,您的 AJAX 调用需要发送一个 ,而不是一个包含 的对象(并且由于它不再是一个对象,而是一个普通字符串,因此您需要指定正确的字符串,以便服务器正确解析它):a
string
string
contentType
$.ajax({
url: "/api/Booking/lander",
method: "post",
contentType: "application/json",
data: ab
})
编辑:
为了完整起见:如果您仍然希望 AJAX 调用中的 () 保持对象 (),则需要为该数据定义自定义模型类型:data
{ a: ab }
public class LanderData {
public string a { get; set; }
}
然后将其用作操作中的参数类型:lander
[HttpPost]
public void lander([FromBody]LanderData data)
编辑 2:
该属性实际上是操作中的默认值,因此它不是必需的。无论如何,明确一点永远不会有什么坏处。[FromBody]
[HttpPost]
编辑 3:
请注意,当将数据作为字符串而不是对象发送时,需要确保将其序列化为有效的 JSON 字符串。为此,您需要将字符串括在一对额外的单引号中,如 .这样,您的请求正文将是一个有效的 JSON 字符串,而在前一种情况下,它是 ,它不是。'"Chocolate Smoothies ya know"'
"Chocolate Smoothies ya know"
Chocolate Smoothies ya know
评论
'"Chocolate Smoothies ya know"'
评论