1

Knockout JS を使用して、MVC コントローラーに渡すモデルを構築しています。ko.observable() アイテムは問題なくコントローラーに渡されますが、ko.observableArray([]) データはコントローラーで「count=0」として表示されます。

以下は、ビューで構築しているオブジェクトです。

var AddViewModel = function () {

self.ModelRequest = {
    Object: {
                VarArray: ko.observableArray([]),
                Var1: ko.observable(""),
                Var2: ko.observable("")
                }
    };

....

ModelRequest.Object.VarArray は ko.observableArray であり、オブジェクトにいくつかの属性 (名前、ID、コード、タイプ) が含まれています。

以下は、JSON経由でデータを送信する方法です。

p = ko.toJSON(AddViewModel.ModelRequest);
debugger;

$.ajax({
    url: url,
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: ko.toJSON(AddViewModel.ModelRequest),
    success: function (data) { 
       ...something...
    }
});

コードをデバッグしているときに、上記の p 変数を調べると、次のように表示されます。

{"Object":{"VarArray":[{"Name":"Name 1", "Id":2, "Code":"50.1", "Type":"A"}], 
"Var1":"abc", "Var2":"def"}}

コントローラーに渡されるオブジェクトを調べると、Var1 と Var2 は正しい値を持っていますが、VarArray は "Count=0" です。

何かご意見は?これを見ていただきありがとうございます。この時点で、私は任意のアイデアを試してみます!!

編集 10/6/13: これは私のコントローラー アクションです:

[HttpPost]
public CRUDResponse AddItem(AddRequest ModelRequest)
{
   ... something here ...
}

この時点で ModelRequest を調べると、VarArray が "Count = 0" であることがわかります。

編集 10/8/13: これは AddRequest の詳細です:

#region Public Members

public ObjectType Object { get; set; }

#endregion Public Members

ObjectType は次のとおりです。

#region Public Members

public int Var1 { get; set; }
public int Var2 { get; set; }
public List<SpecType> VarArray { get; set; }

#endregion Public Members

SpecType の場所

public string Name { get; set; }
public int Id { get; set; }
public string Code { get; set; }
public FieldType Type { get; protected set; }

FieldType は Enum です。

更新:問題を見つけたところです。UI から Web API を呼び出すと、JSON を介してプロパティが適切にシリアル化されていないようです。上記のプロパティは TypeB を継承した TypeA です。TypeB には、TypeA に必要なすべてのフィールドが含まれています。シリアル化に失敗したプロパティを TypeA ではなく TypeB に変更すると、正常にシリアル化され、必要なすべての値が Web API に反映されます。

したがって、基本的に、型が別の型から派生している場合、JSON は値のシリアル化に失敗します。値を基本型として宣言して継承を削除すると、問題が修正されます。

では、型が別のクラスから継承されたプロパティをシリアル化する方法はありますか?

エリック

4

1 に答える 1

0

問題は、A: observableArray にデータを入力していないか、B: コントローラーで適切なオブジェクト タイプを受信して​​いないことです。これは、正しく送信していないか、正しく受信していないためです。

これをやってみてください -

function testData(name) {
    var self = this;
    self.Name = ko.observable(name);
}

ビューモデルの内部

var AddViewModel = function () {
    self.ModelRequest = {
        Object: {
            varArray: ko.observableArray([
                new testData('Your my boy blue'),
                new testData('Frank the tank')
        ]),
        var1: ko.observable(""),
        var2: ko.observable("")
        }
    };
}

そして、コントローラー アクションが実際にデータを取得しているかどうかを確認します。

そうでない場合は、コントローラーに送信しているオブジェクトと、コントローラーが認識するオブジェクトが一致していない可能性があります。

于 2013-10-07T02:03:15.847 に答える