ajax 将 null 发送到 MVC Api 控制器

Posted

技术标签:

【中文标题】ajax 将 null 发送到 MVC Api 控制器【英文标题】:ajax sending null to MVC Api Controller 【发布时间】:2020-12-30 16:27:09 【问题描述】:

我试图通过 Ajax 将变量作为 vm 从视图发送到 API 控制器,但在控制器中获取它的方法的参数为空! 错误是: EntityFramework.SqlServer.dll 中出现“System.NotSupportedException”类型的异常,但未在用户代码中处理

jQuery 代码:

            var vm = 
                courseIds: []
            ;

            var courses = new Bloodhound(
                datumTokenizer: Bloodhound.tokenizers.obj.whitespace('name'),
                queryTokenizer: Bloodhound.tokenizers.whitespace,
                remote: 
                    url: '/api/Course/GetCourses?query=%QUERY',
                    wildcard: '%QUERY'
                
            );
            var teachers = new Bloodhound(
                datumTokenizer: Bloodhound.tokenizers.obj.whitespace('name'),
                queryTokenizer: Bloodhound.tokenizers.whitespace,
                remote: 
                    url: '/api/Teacher/?query=%QUERY',
                    wildcard: '%QUERY'
                
            );


            $('#teacher').typeahead(
                    minLength: 1,
                    highlight: true
                ,
                
                    name: 'teachers',
                    display: 'Name',
                    source: teachers
                ).on("typeahead:select",
                function(e, teacher) 
                    vm.teacherId = teacher.Id;
                );
 $("#courses").typeahead(
                    minLength: 1,
                    highlight: true
                ,
                
                    name: 'courses',
                    display: 'Name',
                    source: courses
                ).on("typeahead:select",
                function(e, course1) 
                    $("#courselist").append("<li class='list-group-item'>" + course1.Name + "</li>");
                    $("#courses").typeahead("val", "");
                    vm.courseIds.push(course1.Id);
                    
                    console.log(vm); 
                );
            $("#newPlan").submit(function(e) 
                e.preventDefault();
                $.ajax(
                        url: "/api/new/",
                        method: "post",
                        data: vm
                    ).done(function() 
                        console.log("Done!");
                    )
                    .fail(function() 

                    );
            );

控制器代码是:

        [HttpPost]
        public IHttpActionResult Plan(NewPlanDto coursePlan)
        

            var teacher = _context.teachers.Single(m => m.Id == coursePlan.TeacherId);
            var courses = _context.Courses.Where(
                m => coursePlan.coursesId.Contains(m.Id)).ToList();


            if (courses != null)
            
                foreach (var course in courses)
                
                    var newCoursePlan = new CoursPlan()
                    
                        Teacher = teacher,
                        Course = course

                    ;
                    _context.CoursPlans.Add(newCoursePlan);
                
            
            _context.SaveChanges();

            return Ok();
        

领事结果:

courseIds: 数组 [ 4, 4 ] 教师编号:6

【问题讨论】:

coursePlan 为空有很多正当理由。但我们无法为您提供这么少的细节(NewPlanDto 是如何定义的,HTTP 请求中传递的确切值等) 我不明白你是如何制作虚拟机的?什么是虚拟机?你是如何定义虚拟机的? 包括console.log(vm)的打印 vm 是 jquery 视图模型,用作保存课程 ID 的数组 var vm = courseIds: [] ; @CamiloTerevinto NewPlanDto 是一个与模型相关的 Dto 类 命名课程计划 public class NewPlanDto public int TeacherId get;放; 公共列表课程ID 获取;放; 【参考方案1】:

您的问题是您在将对象发送到控制器时没有序列化它。

例如:

$.ajax(
        url: "/api/new/",
        method: "post",
        data: JSON.stringify(vm)
    ).done(function() 
        console.log("Done!");
    )
    .fail(function() 

    );

【讨论】:

@AmirhoseinAraghi JSON.stringify() 方法将 javascript 对象或值转换为 JSON 字符串 @AmirhoseinAraghi 从现在开始。每次您在 actionresult 中有模型输入时。您需要在 ajax 中将 stringify json 作为数据发送。

以上是关于ajax 将 null 发送到 MVC Api 控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Ajax 以数组格式将多个图像从 MVC 视图发送到控制器?

ASP.NET Core MVC - 使用 Ajax 将数据发送到另一个模型中的模型

如何使用 ASP.NET MVC 通过 Ajax 将检查的行发送到服务器?

ASP.NET Core MVC - 将 HTML 表转换为 json 并使用 ajax 发送到控制器

如何将两个数组作为 POST 请求参数从 AJAX 发送到 MVC 控制器(ASP .NET Core 3.1 剃须刀)?

ASP.NET Core MVC 使用 api +javascript 客户端与 ajax