拥有这些 ASP.NET MVC 视图模型:
public class User
{
public string Name { get; set; }
public LabeledEmail LabeledEmail { get; set; }
}
public class LabeledEmail
{
public IList<ContactLabel> Labels;
public IList<ContactEmail> Emails;
}
和像这样的淘汰赛视图模型:
<script type="text/javascript">
$(function() {
ko.applyBindings(viewModel);
$("#profileEditorForm").validate({
submitHandler: function(form) {
if (viewModel.save())
window.location.href = "/";
return false;
}
});
});
var viewModel = {
Name: ko.observable("@Model.Name"),
EmailLabels: ko.observableArray(@Html.Json(Model.LabeledEmail.Labels.Select(l => l.Name)) || []),
Emails: ko.observableArray(@Html.Json(Model.LabeledEmail.Emails) || []),
addEmail: function() {
viewModel.Emails.push(@Html.Json(new ContactEmail()));
},
removeEmail: function(eml) {
viewModel.Emails.remove(eml);
},
saveFailed: ko.observable(false),
// Returns true if successful
save: function() {
var saveSuccess = false;
viewModel.saveFailed(false);
jQuery.ajax({
type: "POST",
url: "@Url.Action("MyAction", "MyController")",
data: ko.toJSON(viewModel),
dataType: "json",
contentType: "application/json",
success: function(returnedData) {
saveSuccess = returnedData.Success || false;
viewModel.saveFailed(!saveSuccess);
},
async: false
});
return saveSuccess;
}
};
</script>
正确回传到控制器的是User.Name
,但是User.LabeledEmail
是空的。我必须按照我的方式展平模型,以便能够在其他地方单独使用列表。事实上,我知道 viewModel.Emails 在保存时已正确填充,但 User.LabeledEmails 以某种方式返回 null。
它基本上归结为分配Model.LabeledEmail.Emails
和viewModel.Emails
交易将得到解决,似乎,但我不知道如何也找不到任何合适的例子。
- 我犯了什么错误
- 如何正确地做到这一点?
先感谢您。