传递给WebApi方法的参数在到达方法体时为null

时间:2016-05-04 13:03:15

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

我正在建立一个简单的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);
                        }
                    });
                }
            });

然后在datepicker中进行选择后发布到以下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发布的值?

N.B。我在Firebug中使用了格式,并且正确的日期正确地发布到方法

enter image description here

2 个答案:

答案 0 :(得分:2)

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

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

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

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

data: JSON.stringify(dateX),

或直接传递像这样的对象

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

答案 1 :(得分:0)

我最终做了以下事情:

$('#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; }
    }