MVC 6 - 不能再将多个JSON参数传递给控制器

时间:2015-09-30 12:39:15

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

我最近一直在努力使用新的ASP.NET 5系统和微软的ASP.NET MVC 6,但我发现了一些阻碍我前进的非常关键的问题;最值得注意的是,我似乎无法通过控制器方法传递多个JSON参数。

例如,我有以下控制器方法;

[HttpPost]
[Route("edit/profile")]
public void Attribute([FromBody]Models.Profile model, bool editing) {
    // ...
    // model always comes in null
    // editing always comes in default (false)
}

我正在尝试使用$.ajax将数据传递到此控制器。

$.ajax({
    url: '/edit/profile',
    type: 'POST',
    dataType: 'json',
    contentType: 'application/json',
    data: JSON.stringify({ model: _this.model, editing: true })
});

但无论我做什么,参数总是在控制器上null。我尝试了各种各样的事情,如果我忽略了({ model : _this.model ... })部分并且只传入一个参数,它会按预期的那样通过data: JSON.stringify(_this.model)

模型看起来像这样; (显然不是最终的模型,只是在我处理这个问题时只是一个假人)

_this.model = {
    Id: null,
    Name: null
    Text: null
};

它对应于此C#类;

namespace Models {
    public class Profile {
        public string Id { get; set; }
        public string Name { get; set; }
        public string Text { get; set; }
    }
}

我无法理解我的生活。这在MVC 5上运行良好,但自升级以来它就完全不复存在了。

我也在使用 jQuery 2.1.4

5 个答案:

答案 0 :(得分:2)

我有类似的问题。我通过使用单独的数据类来解决它。

[HttpPost]
[Route("edit/profile")]
public void Attribute([FromBody] ProfileData data)
{
    var model = data.Model;
    var editing = data.Editing;
}

public class ProfileData
{
    public Models.Profile Model { get; set; }
    public bool Editing { get; set; }
}

$.ajax({
    url: '/edit/profile',
    type: 'POST',
    dataType: 'json',
    contentType: 'application/json',
    data: { data: { Model: _this.model, Editing: true } }
});

答案 1 :(得分:1)

试试这个:

$.ajax({
    url: '/edit/profile',
    type: 'POST',
    dataType: 'json',
    contentType: 'application/json',
    data: { model: JSON.stringify(_this.model), editing: true }
});

OR

$.ajax({
    url: '/edit/profile',
    type: 'POST',
    dataType: 'json',
    contentType: 'application/json',
    data: { model: _this.model, editing: true }
});

要么应该工作。

答案 2 :(得分:1)

创建一个包含Profile Modelbool Editing属性的新类。然后,将其用作API方法中具有[FromBody]属性的参数。

[Route("api/profile/edit")]
[HttpPost]
public void Post([FromBody] ProfileViewModel content)
{

}

public class ProfileViewModel
{
    public Profile Profile { get; set; }

    public bool Editing { get; set; }
}

public class Profile
{
    public string Name { get; set; }
}

$.ajax({
    url: '/api/profile/edit',
    method: 'POST',
    dataType: 'json',
    contentType: 'application/json',
    data: JSON.stringify({ profile: { name: 'Test' }, editing: true })
});

在Angular中(您使用它,正如您在评论中提到的那样),您可以使用:

$http.post('api/profile/edit', { profile: { name: 'Test' }, editing: true });

答案 3 :(得分:0)

如果您使用此查询并删除FromBody属性,它应该有效。

$.ajax({
    url: '/edit/profile',
    type: 'POST',
    dataType: 'json',
    contentType: 'application/json',
    data: { model: _this.model, editing: true }
});


[HttpPost]
[Route("edit/profile")]
public void Attribute(Models.Profile model, bool editing) {

}

答案 4 :(得分:0)

js文件中的json objct:

var PeopleJson = {
        Name: "Volfgam"
}

要发送控制器,请使用$ .post()而非$ .ajax:

$.post("/api/people", PeopleJson)
        .done(function (response) {
            that.IsLoading(false);
            alert(response);
        })
        .fail(function (error) {
            that.IsLoading(false);
            alert(error.statusText);
        });

您的控制器非常简单:

[HttpPost]
public ActionResult AddPeople(Teste PeopleJson)
{
   return Json(PeopleJson);
}

你的班级:

   public class Teste
   {
      public string Name { get; set; }
   }

我希望这会有所帮助。