MVC Controller Action仅接收来自AJAX的空值

时间:2017-10-09 03:27:15

标签: jquery ajax asp.net-core asp.net-core-mvc

我有一个ajax调用,它将两个参数的数据传递给控制器​​操作。调用该操作,但操作的参数始终具有空值(在这种情况下,整数的默认值为0)。我已经确保检查ajax调用发送的数据包,并且我确实看到了我打算使用字符串化JSON中的正确参数/属性名称发送的正确值。

这是控制器动作:

[HttpPost]
public IActionResult Summary(int courseID, String test)
{
    using (LearningCurveContext db = new LearningCurveContext())
    {
        Course course = db.Courses.Where(c => c.CourseId == courseID).FirstOrDefault();
        CourseSummary courseSummary = new CourseSummary
        {
            courseID = course.CourseId,
            courseName = course.Name,
            courseDescription = course.Description
        };

        return PartialView(courseSummary);
    }
}

这是Ajax调用:

$(document).on("click", ".courseName", function ()
    {
        var element = this;
        $.ajax({
            url: $(element).attr("data-url"),
            type: "POST",
            data: JSON.stringify({ "courseID": "1", "test": "blah" }),
            dataType: "json",
            contentType: "application/json; charset=utf-8",
            cache: false,
            success: function (data)
            {
                $("#details-live").html(data);
            },
            error: function ()
            {
                alert("Could not load course summary");
            }
        });
    });

我尝试删除内容类型选项,以及不对数据进行字符串化并将courseID的值发送为1以及“1”。似乎没什么用。在调用操作并运行代码时,URL是正确的 - 只是数据似乎没有被绑定。

3 个答案:

答案 0 :(得分:0)

因为对于Asp.Net核心,您必须明确框架查找数据的位置。在这种情况下,您需要指定[FromBody],但您还必须重构代码才能使用模型,因为您只能在操作中使用该属性一次。

public class CourseSummaryPostModel {
    public int courseID { get; set; }
    public String test { get; set; }
}

行动更新

[HttpPost]
public IActionResult Summary([FromBody] CourseSummaryPostModel model) {        
    int courseID = model.courseID;
    String test = model.test;
    using (LearningCurveContext db = new LearningCurveContext()) {
        Course course = db.Courses.Where(c => c.CourseId == courseID).FirstOrDefault();
        CourseSummary courseSummary = new CourseSummary {
            courseID = course.CourseId,
            courseName = course.Name,
            courseDescription = course.Description
        };
        return PartialView(courseSummary);
    }
}

Ajax与JSON.stringify

的原始帖子保持一致

参考Asp.Net Core: Model Binding

答案 1 :(得分:0)

$(document).on("click", ".courseName", function ()
{
  var element = this;
  $.post( $(element).attr("data-url"),{ courseID: "1", test: "blah" }, function( data ) {
    $("#details-live").html(data);
  });
});

答案 2 :(得分:0)

问题是我使用的是ASP.NET Core,而不是ASP.NET Framework。在核心操作中,仅将单个对象作为参数绑定,并且不喜欢将两者绑定的原始类型。我的解决方案是将需要传递的数据放入单个模型对象(而不是作为多个参数)。