ページ作成用のモデルがあります。
public class PageCreateModel : ActionModel
{
public IList<KeyValuePair<Guid, string>> AvailablePermissions { get; set; }
public IList<KeyValuePair<Guid, string>> AvailableUsers { get; set; }
public IList<KeyValuePair<Guid, string>> AvailableGroups { get; set; }
public string Heading { get; set; }
public bool ShowHeading { get; set; }
public string Description { get; set; }
public ICollection<string> RouteUrls { get; set; }
public IList<KeyValuePair<Guid, string>> SelectedEditingPermissions { get; set; }
public IList<KeyValuePair<Guid, string>> SelectedEditingUsers { get; set; }
public IList<KeyValuePair<Guid, string>> SelectedEditingGroups { get; set; }
}
そして、ノックアウト マッピングを使用して、ページの読み込み時にこれをノックアウト モデルに変換しています。
var mappedModel = ko.mapping.fromJS(@Html.Raw(JsonConvert.SerializeObject(Model)));
このコードを投稿して使用すると:
mappedModel.save = function(form) {
mappedModel.AvailablePermissions([]);
mappedModel.AvailableUsers([]);
mappedModel.AvailableGroups([]);
console.log(ko.toJS(mappedModel));
ko.utils.postJson('@Url.Action("Create", "Page")', { pageCreateModel: ko.toJS(mappedModel) });
};
次のアクションに進みます。
[HttpPost]
public ActionResult Create(PageCreateModel pageCreateModel)
{
return View(HydrateModel(pageCreateModel));
}
この時点で、標準のプロパティ値が投稿されます。しかし、私のコレクション (これまでのところ、私のページでは追加しただけSelectedEditingUsers
です) には、コレクション内に空のオブジェクトがあります。たとえば、ページで 2 人のユーザーをコレクションに追加し、それを投稿したとします。MVC モデルの SelectedEditingUsers には 2 つのコレクションがありますが、これらのオブジェクトには空の Guid と値の null が含まれています。
Chrome コンソールからサーバーに送信されるデータは次のとおりです。
pageCreateModel:{"AvailablePermissions":[],"AvailableUsers":[],"AvailableGroups":[],"Heading":"Test","ShowHeading":true,"Description":null,"RouteUrls":null, "SelectedEditingPermissions":[],"SelectedEditingUsers":[{"キー":"d81f409a-5fed-4330-8640-004bede4e6fb","値":"ユーザー1"},{"キー":"5628ad64-567b-499d- bee1-cb6c3dc397eb","Value":"User2"}],"SelectedEditingGroups":[],"ActionSuccess":false,"ActionMessage":null," ko_mapping ":{"ignore":[],"include": ["_destroy"],"copy":[],"observe":[],"mappedProperties":{"AvailablePermissions[0].Key":true,"AvailablePermissions[0].Value":true,"AvailablePermissions 1 .Key":true,"AvailablePermissions 1.Value":true,"AvailablePermissions[2].Key":true,"AvailablePermissions[2].Value":true,"AvailablePermissions[3].Key":true,"AvailablePermissions[3].Value":true, "AvailablePermissions[4]...[etc]
完全なモデルが MVC によって適切に受信されるように修正するにはどうすればよいですか? RedirectToAction などを使用できるように、postJSON を使用する必要があります。
編集:代わりにAJAX呼び出しを試してください:
mappedModel.save = function(form) {
mappedModel.AvailablePermissions([]);
mappedModel.AvailableUsers([]);
mappedModel.AvailableGroups([]);
//mappedModel.__ko_mapping__([]);
//console.log(ko.toJS(mappedModel));
$.ajax({
url: '@Url.Action("Create", "Page")',
type: 'POST',
data: ko.toJSON(mappedModel),
contentType: 'application/json; charset=utf-8',
success: function(data) {
alert("Success!");
}
});
//ko.utils.postJson('@Url.Action("Create", "Page")', { pageCreateModel: ko.toJS(mappedModel) });
//ko.utils.postJson($("form")[0], { pageCreateModel: ko.toJS(mappedModel) });
//ko.utils.postJson('@Url.Action("Test", "Page")', { ko.toJS(mappedModel) });
};
そして、私はまだ同じ問題を抱えています:
そして、ここにその投稿があります:
{"AvailablePermissions":[],"AvailableUsers":[],"AvailableGroups":[],"Heading":"Test","ShowHeading":true,"Description":null,"RouteUrls":null,"SelectedEditingPermissions ":[],"SelectedEditingUsers":[{"キー":"5628ad64-567b-499d-bee1-cb6c3dc397eb","値":"ユーザー1"},{"キー":"6d7439aa-7728-4add-953f- 28b306fff5d0","Value":"User2"}],"SelectedEditingGroups":[],"SelectedViewingPermissions":[],"SelectedViewingUsers":[],"SelectedViewingGroups":[],"ActionSuccess":false,"ActionMessage" :null," ko_mapping ":{"ignore":[],"include":["_destroy"],"copy":[],"observe":[],"mappedProperties":{"AvailablePermissions[0].Key":true,"AvailablePermissions[0].Value":true,"AvailablePermissions 1 .Key":true,"AvailablePermissions 1.Value":true,"AvailablePermissions[2].Key":true,"AvailablePermissions[2].Value":true,"AvailablePermissions[3].Key":true,...など"