如何设置WebApiConfig.cs? MVC

时间:2017-07-16 20:57:07

标签: c# jquery ajax model-view-controller

以下是我的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,请指导我应该做出哪些改变。

即使以下设置也不起作用:

enter image description here

enter image description here

enter image description here

3 个答案:

答案 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

编辑2:

[HttpPost] public void lander([FromBody]LanderData data) 属性实际上是[FromBody]操作中的默认属性,因此它不是必需的。在任何情况下,明确都不会伤害。

编辑3:

请注意,当以字符串而不是对象发送数据时,您需要确保将其序列化为有效的JSON字符串。为此,您需要将字符串括在另外一对单引号中,如[HttpPost]中所示。这样,您的请求正文将是'"Chocolate Smoothies ya know"',这是一个有效的JSON字符串,而在前一种情况下,它是"Chocolate Smoothies ya know",而不是。{/ p>

答案 2 :(得分:0)

routeTemplate: "api/{controller}/{action}/{id}",应更改为routeTemplate: "Api/{controller}/{id}",