なぜ今初めてこの振る舞いに気づいたのかわかりません。これが設計された動作であるかどうか、または何かが足りないかどうかを確認するために探しています。
を実装しIEnumerable<T>
、追加のプロパティを提供するビューモデルがあるとします。例えば:
public class MyResultsViewModel : IEnumerable<MyResultViewModel>
{
public IEnumerable<MyResultViewModel> Results { get; set; }
public string SomeAdditionalProperty { get; set; }
public IEnumerator<MyResultViewModel> GetEnumerator()
{
return Results.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator; }
}
このモデルをjsonとして返すコントローラーもあるとします。例えば:
public ActionResult MyResults()
{
var entities = PrivateMethodToGetEntities();
var models = Mapper.Map<MyResultsViewModel>(entities);
models.SomeAdditionalProperty = "I want this in the JSON too";
return Json(models, JsonRequestBehavior.AllowGet);
// models now contains a populated Results as well as the add'l string prop
}
クライアントでJSONリクエストから結果を取得すると、常に配列として返されます。例えば:
$.get('/Path/To/MyResults')
.success(function (results) {
alert(results.SomeAdditionalProperty); // this alerts 'undefined'
alert(results.length); // this alerts the size / count of Results
alert(results[0]); // this alerts object
// inspecting results here shows that it is a pure array, with no add'l props
});
ビューモデルを実装しないようにリファクタリングする前にIEnumerable<T>
、これが仕様によるものであり、予期されるものであることを確認したいと思います。追加のプロパティに対応するためにjavascript配列オブジェクトのプロトタイプを拡張する必要があるため、これは理にかなっていると思います。
アップデート:
内部列挙可能オブジェクトに名前を付けないように、ビューモデルに次の変更を加えましたResults
。
public class MyResultsViewModel : IEnumerable<MyResultViewModel>
{
public IEnumerable<MyResultViewModel> NotNamedResults { get; set; }
public string SomeAdditionalProperty { get; set; }
public IEnumerator<MyResultViewModel> GetEnumerator()
{
return NotNamedResults.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator; }
}
この変更により、動作は維持されます。alert(JSON.stringify(results))
列挙されたMyResultViewModel
sのコレクションに対して通常の配列構文を生成します。
[{"ResultProp1": "A"、 "ResultProp2": "AA"、 "ResultProp3": "AAA"}、{"ResultProp1": "B"、 "ResultProp2": "BB"、 "ResultProp3": "BBB "}、{" ResultProp1 ":" C "、" ResultProp2 ":" CC "、" ResultProp3 ":" CCC "}、{" ResultProp1 ":" D "、" ResultProp2 ":" DD "、" ResultProp3 ": "DDD"}、{"ResultProp1": "E"、 "ResultProp2": "EE"、 "ResultProp3": "EEE"}]
JsonResult
コントローラアクションがを返し、jquerysuccess
関数が呼び出されるまでの間に追加のプロパティが失われているようです。