1

ASP.NETMVC4WebApiとKnockout.jsを使用しています。

私のモデルは、1-Nコントロールを含むページで構成されています。新しいページをロードする必要がある場合は、HTMLビューとJSONシリアル化オブジェクトをフェッチし、すべてをKOでまとめます。私のモデルは非常に動的であるため、KOマッピングプラグインを使用するので、すべてのオブザーバブルを定義する必要はありません。

これが私の(非常に単純化された)モデルです:

public class Page
{
    public string Name { get; set; }
    public List<Control> Controls { get; set; }        
}

public abstract class Control
{
    public string Name { get; set; }
    public abstract string SayHi();
}

public class Form : Control
{
    public override string SayHi()
    {
        return string.Format("Hi, I'm form {0}", Name);
    }
}

public class Datagrid : Control
{
    public override string SayHi()
    {
        return string.Format("Hi, I'm datagrid {0}", Name);
    }
}

実際、私はこれを取得しています(JSON.NETでシリアル化されています):

[
{
    "Name":"pagina1",
    "Controls":
    [
        {"Name":"laTablita"},
        {"Name":"theForm"}
    ]
},
{
    "Name":"pagina2",
    "Controls":
    [
        {"Name":"elFormito"},
        {"Name":"theDatagrid"}
    ]
}
]

問題は、JSONにルートキーとしてクラス名が必要であり(KO.Mappingがそのように必要とするため)、JSON.NETシリアライザーに含まれていないことです。

これが私がJSONを必要とする方法です:

[
{
    "Name":"pagina1",
    "Controls":
    [
        "Datagrid":
        {
            "Name":"laTablita"
        },
        "Form":
        {
            "Name":"theForm"
        }
    ]
},
{
    "Name":"pagina2",
    "Controls":
    [
        "Form":
        {
            "Name":"elFormito"
        },
        "Datagrid":
        {
            "Name":"theDatagrid"
        },
    ]
}
]
4

1 に答える 1

1

コメントで述べたように、必要なJSONはjson仕様に適合していません。私があなたが必要としているものを理解しているなら、あなたは各コントロールがどんなタイプであるかを特定したいと思います。これを行うにはいくつかの方法があります。最初のJSON.NETJsonSerializerSettingsは、プロパティを持つオブジェクトを取得できますTypeNameHandling。デフォルトでは、これは「なし」に設定されています。Objectに設定すると、タイプ名が含まれます。ただし、これは.NETタイプ名であり、おそらくあなたが求めているものではありません。

簡単なアプローチは、クラスのタイプを表す文字列を返すTypeNameプロパティをコントロールクラスに追加することです。

返されるJSONは次のようになります。

[
{
    "Name":"pagina1",
    "Controls":
    [
        {"Name":"laTablita", TypeName: "Datagrid"},
        {"Name":"theForm", TypeName: "Form"}
    ]
},
{
    "Name":"pagina2",
    "Controls":
    [
        {"Name":"elFormito", TypeName: "Form"},
        {"Name":"theDatagrid", TypeName: "Datagrid"}
    ]
}
]

お役に立てれば。

于 2012-04-13T22:33:20.133 に答える