如何设置 WebApiConfig.cs?MVC的

How to set up WebApiConfig.cs? MVC

提问人:Asbah Qadeer 提问时间:7/17/2017 最后编辑:Asbah Qadeer 更新时间:7/17/2017 访问量:3450

问:

以下是我的 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 }
            );
        }
    }
}

我面临很多问题,我被告知我的代码是正确的,我的问题在于这个文件。伙计们,我的问题就在这个链接上,请指导我应该做出哪些改变。

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

enter image description here

enter image description here

enter image description here

C# jQuery AJAX 模型-视图-控制器

评论


答:

0赞 MKR 7/17/2017 #1

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

评论

0赞 Asbah Qadeer 7/17/2017
在那之后,我无法按其名称单独定位我的控制器?这怎么算是解决方案
0赞 MKR 7/17/2017
为什么你不能指定你的控制器?routeTemplate 中有占位符。我希望您对包含控制器和操作的定义感到困惑。{controller}RouteConfig.cs
1赞 Rahul 7/17/2017 #2

根据您的链接问题,您在 API 端点中得到 null,因为您已将参数声明为可选参数,默认为 .NULLstring 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
    })

它没有自动绑定的唯一原因是,您的路由将参数名称指定为 ,但您的参数名称是 。ida

您应该为此声明一个单独的路由,然后像

        config.Routes.MapHttpRoute(
            name: "lander",
            routeTemplate: "api/Booking/lander/{a}",
            defaults: new {controller = "lander", a = RouteParameter.Optional }
        ); 

评论

0赞 Asbah Qadeer 7/17/2017
我收到了一个小的语法问题。让我把它放在你的编辑中
0赞 Asbah Qadeer 7/17/2017
虽然我用逗号来修复它
0赞 Rahul 7/17/2017
@AsbahQadeer,是的,明白了......编辑。。选中“在答案中编辑”
1赞 Johan Hirsch 7/17/2017 #3

实际上,这里有几个问题。

您的 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 调用需要发送一个 ,而不是一个包含 的对象(并且由于它不再是一个对象,而是一个普通字符串,因此您需要指定正确的字符串,以便服务器正确解析它):astringstringcontentType

$.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

评论

0赞 Asbah Qadeer 7/17/2017
一个结构非常好的答案,但不幸的是,这也不起作用
0赞 Johan Hirsch 7/17/2017
您需要将字符串括在附加引号中:。有关解释,请参阅上面的编辑 3。'"Chocolate Smoothies ya know"'