MVC控制器操作对象参数从AJAX POST接收空值

时间:2019-06-26 17:45:57

标签: javascript asp.net ajax api model-view-controller

使用AJAX将包含数组值的对象发送到MVC控制器操作。断点显示动作已到达,但接收字符串数组的对象为空。

调用Asp.net MVC Web Api使用AJAX进行。创建对象,然后使用JSON.Stringify。 MVC动作参数对象设置为从AJAX调用接收值。我已经尝试过[HttpPost]属性以及[Route(“ api / Controller”)]。我也曾尝试在javascript中将对象存储在另一个对象中。然后使用JSON.stringify,然后将其设置为ajax'data'参数。

脚本代码

        //var data = {
        //    Apimethod: null,
        //    Employees: [],
        //    Type: null
        //};
        var data = [];
        //var jsonData = JSON.stringify(data);

        $.ajax({
            type: "POST",
            dataType: "json",
            contentType: "application/json; charset=utf-8",
            url: "api/{controller}/" + data.Apimethod,
            data: { employees: data }
            //traditional: true
        }).done(function (response) {
            $('#modelmsg').empty();
            $('#modelmsg').append(response);
            return returnguid = response;
        }).fail(function (response) {
            console.log('Error: ' + response);
        });

WebApiConfig


            config.Routes.MapHttpRoute(
                name: "Name",
                routeTemplate: "api/{controller}/{action}/{employees}",
                defaults: new { action = "{name}", employees = RouteParameter.Optional }
            );

MVC Controller
```c#
[Route("api/{controller}/{employees}")]
        public IHttpActionResult InsertEmployeesIntoRDLTable(EmployeeList employees)
        {
                //Code Here
                return Json(response);
        }

类对象EmployeeList

    public class EmployeeList
    {
        public string Apimethod { get; set; }
        public string[] Employees { get; set; }
        public string Type { get; set; }
    }

从ajax调用产生的http链接接收到错误: 没有MediaTypeFormatter可用于从媒体类型为“ application / octet-stream”的内容中读取类型为“ String []”的对象。

总体预期结果是从AJAX呼叫接收参数。但是Object类保持为空。

更新

如下所示,

抓取似乎有效。只是不确定原因。

所以我发现fetch可以完成工作。我不是100%知道为什么,但是确实如此。

        fetch(url, {
            method: "POST",
            headers: {
                'Accept': 'application/json',
                'Content-Type': 'application/json',
                'credentials': 'include'
            },
            body: jsonData
        })
        .then(response => {
            return response.json();
        })
        .then(response => {
            //code
        })
        .catch(function (e) {
            //code
        });

1 个答案:

答案 0 :(得分:0)

您不需要对数据进行分类。由于您已经提供了dataType: "json"选项,因此可以直接提供数据。

尝试一下 data: { employees:data }

还要设置一种always方法以进行进一步的故障排除。