2

ページ作成用のモデルがあります。

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,...など"

4

1 に答える 1

4

ko.utils.postJsonContent-Typeリクエストヘッダーをに設定しませんapplication/json。フォームでエンコードされた値としてリクエストを送信するだけです。したがって、$.ajax代わりに使用して、正しいコンテンツタイプヘッダーを指定できるようにします。

mappedModel.save = function(form) {
    mappedModel.AvailablePermissions([]);
    mappedModel.AvailableUsers([]);
    mappedModel.AvailableGroups([]);
    $.ajax({
        url: '@Url.Action("Create", "Page")',
        type: 'POST',
        data: ko.toJSON(mappedModel),
        contentType: 'application/json; charset=utf-8',
        success: function(data) {
           ...do something
        }
    });
};

Content-Type要求ヘッダーは、この要求がどのようにシリアル化されているかを知るために要求を読み取ろうとするときにASP.NETMVCによって使用されます。

それに加えて、IList<KeyValuePair<Guid, string>>タイプを、 2つのパブリックプロパティを公開するビューモデルクラスであるIList<MyViewModel>whereに置き換えたい場合があります:と。JSONシリアライザーがこれらのタイプにうまく対応できるかどうかはわかりません。MyViewModelKeyValueKeyValuePair<Guid, string>

于 2013-01-11T22:57:30.167 に答える