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"
},
]
}
]