2017-11-10 11 views
1

コードは以下のように見える:jQueryのajax呼び出しを使用してMVC 5アプリでJsonにデータを変換する方法は?

1)エンティティクラス:

public partial class EnergeticalComplex : TrackableBaseObject, IWithDbAffiliateFieldBlockField 
{ 
    private ICollection<Cell> _cells; 
    private ICollection<Document> _documents; 

    public int? AffiliateId { get; set; } 
    public virtual Affiliate Affiliate { get; set; } 

    public int? FieldBlockId { get; set; } 
    [AutoQueryRoot] 
    public virtual FieldBlock FieldBlock { get; set; } 

    public int? FieldId { get; set; } 
    [AutoQueryRoot] 
    public virtual Field Field { get; set; } 

    [NotNull] 
    [AutoQueryRoot] 
    public virtual ICollection<Cell> Cells 
    { 
     get { return _cells ?? (_cells = new List<Cell>().WithLock(SyncRoot)); } 
    } 

    [NotNull] 
    [TrackableRelation] 
    public virtual ICollection<Document> Documents 
    { 
     get { return _documents ?? (_documents = new List<Document>().WithLock(SyncRoot)); } 
    } 
} 

2)コントローラで:

public JsonResult ComboBoxBalanse(int fieldId) 
{ 
    List<EnergeticalComplex> eComplex; 
    using (var c = _contextFactory.CreateContext()) 
    { 
     var eComplexesSet = c.Set(c.GetType() 
      .EntityTypes() 
      .First(t => typeof(IEnergeticalComplex).IsAssignableFrom(t))); 
     eComplex = eComplexesSet 
      .Cast<EnergeticalComplex>() 
      .Where(ec => ec.Field.Id == fieldId && !ec.Name.Contains("KTP")) 
      .ToList(); 
    } 

    ViewData["EnergeticalComplexList"] = eComplex; 
    ViewData["fieldId"] = fieldId; 

    return Json(eComplex, JsonRequestBehavior.AllowGet); 
} 

3)JavaScriptのモジュールは:

function onClickShowButton() { 
    var selectBoxField = $("#divFieldsComboBox").dxSelectBox("instance"); 
    var indField = selectBoxField.option("value"); 

    $.ajax({ 
     contentType: "application/json; charset=utf-8", 
     type: 'POST', 
     url: '/LostEnergyCalculation/ComboBoxBalanse', 
     dataType: 'json', 
     data: "{ fieldId: " + indField + " }" 
    }).done(function (data) { 
     alert(JSON.stringify(data)); 
    }); 
} 

プログラムフローは.done()の後にブロックに入りません。

+0

_after_ '.done()'、詳しく教えてください。 'console.log(data);の出力は何ですか? – Satpal

+0

コンソールにエラーがあるかどうか確認しましたか? –

+0

console.log(data)で.fail()ブロックを追加しましたが、これがあります:ReferenceError:データが定義されていません。 – tesicg

答えて

1

さらにクラスのメンバー変数を持つエンティティクラスを使用しているようです。 この場合、 'eComplex'オブジェクトに循環参照のためにJSonのシリアル化の問題が発生する可能性があります。 これを防止するには、すべてのサブクラスメンバー変数を持たない新しいクラスを宣言するか、または.Select()を使用して必要な要素のみを使用します。 つまり、あなたのコントローラ内

eComplex = eComplexesSet 
      .Cast<EnergeticalComplex>() 
      .Where(ec => ec.Field.Id == fieldId && !ec.Name.Contains("KTP")) 
      .Select(m=> new { 
      VariableName = m.ModelVariableName, 
      // Same for elements which you needed for 
      }); 
関連する問題