MVC控制器仅接收来自AJAX的空值的动作
问题描述:
我有一个ajax调用,它将两个参数的数据传递给控制器动作。该操作被调用,但该操作的参数始终为空值(在这种情况下,该整数是其默认值为0的值)。我已经确保检查ajax调用发送的数据包,并且我确实看到了正确的值,我打算使用正确的参数/属性名称以字符串化的JSON发送。MVC控制器仅接收来自AJAX的空值的动作
这里是控制器动作:
[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是正确的 - 只是数据似乎没有被绑定。
答
因为对于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);
}
}
阿贾克斯仍然是一样的,在原来的职位与JSON.stringify
答
$(document).on("click", ".courseName", function()
{
var element = this;
$.post($(element).attr("data-url"),{ courseID: "1", test: "blah" }, function(data) {
$("#details-live").html(data);
});
});
你展示的代码将被抛'500(内部服务器错误)',因为你指定了'dataType:“json”,'但该方法返回HTML。你处理的是class =“courseName”的元素是什么?(它是一个提交按钮)? –
@StephenMuecke它不会抛出500错误,因为它永远不会返回(它无法查询数据库,因为没有任何内容存在,ID为0)。该元素是一个锚点,但元素不应该重要,因为从它获得的唯一数据是正确的URL。 – DeceitfulEcho
是的,如果它的''元素很重要。显示相关的视图代码。 (尽管你在想什么,它会在浏览器控制台中抛出错误) –