我最近一直在努力使用新的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
答案 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 Model
和bool 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; }
}
我希望这会有所帮助。