我正在尝试发布映射的KnockoutJS
模型的帖子。我可以看到在调试时,JSON
是正确的。但服务器显示Product
为0(空)。虽然它确实包含1个项目。
MVC Controller
:
[HttpPost]
public ActionResult Test(MyModel model, FormCollection fc)
{
return RedirectToAction("index");
}
AJAX
提交:
$('#btnSubmit').click(function (event) {
var theModel = ko.mapping.toJSON(viewModel);
debugger;
$.ajax({
type: 'POST',
url: "@Url.Action("Test", "Home")",
data: theModel,
contentType: 'application/json; charset=utf-8',
success: function (result) {
if (!result.success) {
//alert(result.error);
}
else { }
}
});
});
这是部分JSON
对象:
"Products":[{"Id":2,"Name":"bread"}]
我做错了什么?
编辑:
public class MyModel
{
public int User { get; set; }
public string Address { get; set; }
public string ZipCode { get; set; }
public List<Product> Products { get; set; }
}
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
}
答案 0 :(得分:3)
这是一个完整的测试示例(从控制器发送模型并发布):
<强>控制器强>
public ActionResult Test()
{
var model = new MyModel();
model.Products = new List<Product> { new Product { Id = 2, Name = "bread" } };
return View(model);
}
[HttpPost]
public ActionResult Test(MyModel model, FormCollection fc)
{
// Count equals one
var count = model.Products.Count();
return RedirectToAction("index");
}
<强>模型强>
public class MyModel
{
public int User { get; set; }
public string Address { get; set; }
public string ZipCode { get; set; }
public List<Product> Products { get; set; }
}
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
}
查看强>
@model MyModel
<form method="post">
<input id="btnSubmit" type="submit" value="submit" />
</form>
<script src="~/Scripts/jquery-1.8.2.js"></script>
<script src="~/Scripts/knockout-2.2.0.js"></script>
<script src="~/Scripts/knockout.mapping-latest.js"></script>
<script type="text/javascript">
var Product = function (Id, Name) {
self = this;
self.Id = Id;
self.Name = Name;
}
var mapping = {
'Products': {
create: function (options) {
return new Product(options.data.Id, options.data.Name);
}
}
}
function MyModel(data) {
var self = this;
ko.mapping.fromJS(data, mapping, self);
}
var viewModel = new MyModel(@Html.Raw(Json.Encode(Model)));
$('#btnSubmit').click(function (event) {
event.preventDefault();
var theModel = ko.mapping.toJSON(viewModel);
debugger;
$.ajax({
type: 'POST',
url: "@Url.Action("Test", "Home")",
data: theModel,
contentType: 'application/json; charset=utf-8',
dataType: 'json',
success: function (result) {
if (!result.success) {
//alert(result.error);
}
else { }
}
});
});
</script>
答案 1 :(得分:0)
在与fiddler进行了一些调查之后,结果发现我收到了这条消息的500错误:
System.MissingMethodException: No parameterless constructor defined for this object.
在模型中添加无参数构造函数后,我仍然收到错误消息。这是因为我的模型中有一些SelectList
。所以这就是为什么它不能与模型绑定。
在SO帖子上找到解决方案(寻找Chris S的答案)。希望在面对这个问题时帮助其他人。