4

JQuery を使用して、複雑な ViewModel オブジェクトをビューにフェッチしようとしています$.getJSON。ただし、単純なオブジェクトでは機能しますが、viewmodel に他のオブジェクト リストが含まれていると、Ajax リクエストが機能しなくなります。

これは私がデータを取得する方法です、

$.getJSON('/Company/GetCompanies', function(data) { 
    viewModel.model = ko.mapping.fromJS(data)
    ko.applyBindings(viewModel)
});

これは作業中のビューモデルです。

public class CompanyIndex
{
    public IList<CompanyWithDetail> Companies { get; set; }

    public void FillCompanies()
    {
        UnitOfWork unitOfWork = new UnitOfWork();
        unitOfWork.CompanyRepository.SetProxy(false);
        var CompanyFromDB = unitOfWork.CompanyRepository.GetCompanyWithDetails();

        Companies = new List<CompanyWithDetail>();
        foreach (Company company in CompanyFromDB)
        {
            CompanyWithDetail newCompany = new CompanyWithDetail();
            newCompany.CompanyName = company.CompanyName;
            Companies.Add(newCompany);

        }
        unitOfWork.Dispose();
    }
}

これは CompanWithDetail クラスです。

// For sake of demonstration it only contains name
public class CompanyWithDetail
{
    public string CompanyName { get; set; }
}

これはうまくいっています。ただし、追加すると

public IList<CompanyFaxNumber> FaxNumber { get; set; }

このプロパティを CompanyWithDetail クラスに追加し、ビューモデルFillCompanies()のメソッドに入力するCompanyIndexと、ajax get リクエストが機能しなくなります。

どちらの場合も正しいデータを返しますが、複雑なオブジェクトを追加するとjquery$.getJSONが受信しません。

public ActionResult GetCompanies()
{
    var model = new CompanyIndex();
    model.FillCompanies();
    return Json(model ,JsonRequestBehavior.AllowGet);   
}

編集1:

getJSON がデータを受信しないということは、関数の本体が実行されないことを意味します。

$.getJSON('/Company/GetCompanies', function(data) { 
    alert('test')
});

たとえば、複雑なオブジェクトがない場合はアラートが機能しますが、ビューモデルにオブジェクトを追加するとアラートが機能しなくなります。


編集2

これは、ajax ではなくブラウザから「Company/GetCompanies」を呼び出したときのエラーです。

タイプ 'CompanyManagement.Models.CompanyEmail' のオブジェクトをシリアル化中に、循環参照が検出されました。


複雑なオブジェクトをコントローラーからビューに渡すために何か特別なことをする必要がありますか? 何か案は?

4

3 に答える 3

4

複雑なオブジェクトをコントローラーからビューに渡すために何か特別なことをする必要がありますか?

はい、ビュー モデルを使用する必要があります。オブジェクト階層間の循環参照を含むオブジェクト階層を JSON でシリアル化することはできません。モデルを JSON でシリアル化し、ネットワーク経由で送信できるようにする場合は、これらの循環参照を解除する必要があります。JSON シリアル化形式はこれをサポートしていません。

于 2012-07-05T08:55:55.313 に答える
1

デフォルトの JSON シリアライザーは、循環参照を処理できません。おそらく Company with Emails プロパティがあり、各 Email には Company への参照があります。

Darinが提案したように、ビューモデルを送信する必要があります(とにかくそれがベストプラクティスです):

http://blog.davebouwman.com/2011/12/08/handling-circular-references-asp-net-mvc-json-serialization/

...または、デフォルトの JSON シリアライザーを、循環参照を処理できるJson.NETのようなものに置き換えることもできます。

LINQ to SQL クラスをシリアル化するときの循環参照例外

于 2012-07-05T09:00:10.473 に答える
0

dataType= json を使用して ajax post 呼び出しを簡単に実行できます

    $.ajax({
                type: 'POST',
                url: '@Url.Action("actionName", "controllerName")',
            data: JSON.stringify({ *Perameter If Any* }),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (result) {                  
                  if (result != null) {

                } else {


                }
            }
           });

そして、あなたのアクションメソッドはJsonの結果でなければなりません

public JsonResult ActionName(perameter)
    {

            var modle= getobject();
            return Json(modle);
  }

上記のケースの値では、結果である ajax 呼び出しの成功メソッドで受け取る値は、送信したオブジェクトとまったく同じになります...シリアル化やトリックは必要ありません..見た目はシンプルです

于 2015-06-16T05:11:04.433 に答える