【问题标题】:How to set up WebApiConfig.cs? MVC如何设置 WebApiConfig.cs? MVC
【发布时间】:2017-07-16 20:57:06
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案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)
    

    现在,这告诉操作请求的主体参数a。因此,您的 AJAX 调用需要发送 string,而不是包含 string 的对象(由于它不再是对象,而是纯字符串,您需要为服务器来正确解析它):

    $.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 字符串。为此,您需要将字符串括在一对额外的单引号中,如'"Chocolate Smoothies ya know"'。这样,您的请求正文将是 "Chocolate Smoothies ya know",这是一个有效的 JSON 字符串,而在前一种情况下,它是 Chocolate Smoothies ya know,但不是。

    【讨论】:

    • 一个结构很好的答案,但不幸的是,这也不起作用
    • 您需要将字符串括在额外的引号中:'"Chocolate Smoothies ya know"'。有关说明,请参见上面的编辑 3。
    【解决方案2】:

    根据您的链接问题,您在 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 }
            ); 
    

    【讨论】:

    • 我收到了一个很小的语法问题。让我把它放在你的编辑中
    • 虽然我用逗号来修复它
    • @AsbahQadeer,是的,知道了 .. 已编辑 .. 检查答案中的编辑
    【解决方案3】:

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

    【讨论】:

    • 在那之后,我不能通过他们的名字单独定位我的控制器吗?这怎么可能是一个解决方案
    • 为什么你不能指定你的控制器? routeTemplate 中有{controller} 的占位符。我希望您对包含控制器和操作定义的 RouteConfig.cs 感到困惑。
    猜你喜欢
    • 1970-01-01
    • 2017-05-13
    • 2013-02-07
    • 2019-07-06
    • 2017-01-01
    • 2017-05-03
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    相关资源
    最近更新 更多