使用ASP.NET Core和JQuery从Ajax请求将对象绑定到ASP MVC控制器

5

我正在尝试通过ajax请求向asp mvc控制器方法发布json数据,但由于某些未知原因,asp mvc模型绑定程序无法绑定它。

我已经尝试跟随多个在SO上发布的答案,包括下面的答案

Post json object to ASP MVC doesn't work properly

但是我的jQuery ajax方法总是将null值发布到asp mvc控制器。

基本上,我正在尝试通过ajax请求加载局部视图。

Ajax请求

var myData =
 {
        "Id": 7,
        "Name": "Name 1"
 };

  var obj = { 'test': myData };
  var val = JSON.stringify(obj);
  console.log(val);

  $.ajax({
    type: 'POST',
    dataType: 'html',
    url: '/Home/Partial',
    contentType: 'application/json',
    data: val,
    success: function (xhr, status, response) {
             console.log(response);
             $('#1').html(response.responseText);
         },
    error: function (err) {
        alert("error - " + err);
    }
   });

控制器方法

[HttpPost]
public IActionResult Partial(Test test)
{
   return PartialView("_Test", test);
}

模型

public class Test
{
    public int Id;
    public string Name;
}

1
使用 data: myData。您正在添加另一个对象属性到您发送的值中,这会使 ModelBinder 混淆。 - Rory McCrossan
{"test":{"Id":7,"Name":"Name 1"}} 这是我使用 JSON.stringify() 后的有效载荷,所以我认为没有任何问题... 另外,data:myData 没有起作用。 - PalakM
问题是“测试”。这不是必需的。如果"data: myData"无法正常工作,请在VS中逐步执行请求。如果你甚至都没有到达那一步,请检查控制台找出JS中的错误。 - Rory McCrossan
2
@Pratham,你也可以考虑使用public IActionResult Partial([FromBody]Test test),这样模型绑定器就知道要检查模型的主体部分。 - Nkosi
1
如果您正在使用 .NET Core,它对于需要 [FromBody] 非常挑剔。 - nurdyguy
@Nkosi,问题已解决...非常感谢你...我很感激。 - PalakM
2个回答

4

myData 已足够绑定对象。

var myData = { Id: 7, Name: "Name 1" };
var val = JSON.stringify(myData);
console.log(val);

$.ajax({
  type: 'POST',
  dataType: 'html',
  url: '/Home/Partial',
  contentType: 'application/json',
  data: val,
  success: function (xhr, status, response) {
    console.log(response);
    $('#1').html(response.responseText);
  },
  error: function (err) {
    alert("error - " + err);
  }
});

您还应考虑在参数上使用[FromBody]属性,以便模型绑定器知道要检查模型的主体部分。
[HttpPost]
public IActionResult Partial([FromBody]Test test)  {
    return PartialView("_Test", test);
}

想知道如果我想在控制器端绑定List<Test>,应该采取什么方法? - PalakM
1
@Pratham,你发布一个对象数组,绑定器将会转换并绑定到列表中。 - Nkosi
太好了,它起作用了。模型绑定器来拯救了。是否可能将List<Test>作为另一个类Tests的成员,然后在操作方法中绑定Tests? public class Tests { public Tests() { tests = new List<Test>(); } public List<Test> tests; } - PalakM

0

可能是一个微不足道的问题,但我却忽略了它并花费了几个小时来尝试调试此问题。

确保您要绑定的模型其属性被标记为public


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接