【问题标题】:Parameter passed to WebApi method is null on reaching method body传递给 WebApi 方法的参数在到达方法体时为空
【发布时间】:2016-08-29 22:43:09
【问题描述】:

我正在建立一个简单的 MVC 项目,因为我想在 Umbraco 的范围之外扩展我的知识,而我通常会在该范围内进行此类项目。

我熟悉 WebApi,但似乎无法让它在这种情况下工作。

我的视图中有一个使用以下 Javascript 初始化的日期选择器:

$('#id-tour_0').datepicker({
                changeMonth: true,
                changeYear: true,
                showOn: "button",
                buttonImage: "Content/themes/base/images/icon_calendar.gif",
                buttonImageOnly: true,
                onSelect: function (date) {
                    $.ajax({
                        url: '/api/tour/requesttours',
                        type: 'POST',
                        data: JSON.stringify(date),
                        dataType: 'json',
                        success: function (data){
                            console.log(data);
                        }
                    });
                }
            });

然后在日期选择器中进行选择后,这将发布到以下 WebApi 方法:

public class TourController : ApiController
    {
        [System.Web.Http.AcceptVerbs("GET", "POST")]
        public string RequestTours([FromBody] String request)
        {
            return request;
        }
    }

我的 WebApiConfig.cs 设置如下:

public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }

但是,当我断点我的 WebApi 方法时,我可以看到该请求以 null 的形式出现。为什么会这样?如何让它接收我的 Javascript 发布的值?

注意我已经在 Firebug 中进行了检查,并且正确的日期已正确发布到方法中

【问题讨论】:

  • 你如何设置你的数据值它几乎是空的,你发送它的地方你必须用参数名称指定,如果有数据:'{request:"'+ date.Date +'"}'

标签: javascript c# asp.net-mvc-4 asp.net-web-api


【解决方案1】:

我最终做了以下事情:

$('#id-tour_0').datepicker({
                changeMonth: true,
                changeYear: true,
                showOn: "button",
                buttonImage: "Content/themes/base/images/icon_calendar.gif",
                buttonImageOnly: true,
                onSelect: function (date) {
                    $.ajax({
                        url: '/api/tour/requesttours',
                        type: 'POST',
                        data: {Date: date},
                        dataType: 'json',
                        success: function (data){
                            console.log(data);
                        }
                    });
                }
            });

然后我在我的 C# 代码中创建了一个新对象,我将请求参数映射到:

public class TourController : ApiController
    {
        public string RequestTours([FromBody] DateRequest request)
        {
            return request.Date;
        }
    }

    public class DateRequest
    {
        public string Date { get; set; }
    }

【讨论】:

    【解决方案2】:

    后参数名称应映射到类文件中函数参数的名称

    所以创建一个像这样的对象

    var dateX = new Object();
    dateX.request = date.Date;
    

    然后在你的 ajax 调用中发送这个对象

    data: JSON.stringify(dateX),
    

    或者像这样直接传递对象

    data: '{request:"'+ date.Date +'"}'
    

    【讨论】:

      猜你喜欢
      • 2019-07-23
      • 2018-12-27
      • 1970-01-01
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多