2

ここに私の問題が段階的にあり、

1-次のように、外部のjavascriptファイルからajax getリクエストを実行します。

$.ajax({
    type: "GET",
    dataType: 'json',
    url: '/Company/GetCompanies',
    error: function (xhr, status, error) {
        alert('error');
    return false;
    },
    success: function (response) {
        alert('success');
    return false;
    }
});

2 - これは、リクエストを受け取るアクション メソッドです。

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

3 - CompanyIndex は、上記のアクション メソッドで作成された ViewModel です。

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

    public void FillCompanies()
    {
        /* Part that is not working */
        UnitOfWork unitOfWork = new UnitOfWork();
        Companies = unitOfWork.CompanyRepository
             .Get(orderBy: q => q.OrderBy(u => u.CompanyName)).ToList();
        unitOfWork.Dispose();
        /****************************/

        /* This works fine */
         var companyList = unitOfWork.CompanyRepository
             .Get(orderBy: q => q.OrderBy(u => u.CompanyName)).ToList();
        Companies = companyList.Select(x => new { name = x.CompanyName }).ToList()
            .Select(x => new Company
            {
                CompanyName = x.name

            }).ToArray<Company>();
        /********************/
    }
}

ご覧のとおり、リポジトリと Get メソッドを使用して、データベースから企業エンティティをフェッチします。これも以下で共有します。問題は、データベースからそれらを取得するときです。取得されるモデルのタイプはSystem.Data.Entity.DynamicProxies.Company_someRandomStringHere. この場合、Ajax get リクエストは成功せず、エラー メッセージが表示されます。

ただし、最初に db からフェッチし、ViewModel で Company オブジェクトを作成してリストに割り当てると、ajax は正常に動作し、ajax get リクエストは成功を返します。そして、ViewModel でオブジェクトを作成するときの Company エンティティのタイプはCompanyManagement.Models.Company、あるべき姿です。

必要な場合に備えて、これは私が db からデータを取得するために使用している Get メソッドです。

public virtual IEnumerable<TEntity> Get(
     Expression<Func<TEntity, bool>> filter = null,
     Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
     string includeProperties = "")
{
    IQueryable<TEntity> query = dbSet;

    if (filter != null)
        query = query.Where(filter);

    foreach (var includeProperty in includeProperties.Split
       (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
        query = query.Include(includeProperty);

        if (orderBy != null)
            return orderBy(query).ToList();
        else
            return query.ToList();
}

新しい Company オブジェクトを手動で作成したくありません。どんなアイデアでも大歓迎です。前もって感謝します。

4

2 に答える 2

1

問題が見つかりました。Ajax リクエストの応答はシリアライズ可能である必要があるようです。そのために、動的プロキシをキャンセルしました。

context.ContextOptions.ProxyCreationEnabled = false;

その結果、Get 関数はCompanyManagement.Models.Companyではなくエンティティを返すようになりSystem.Data.Entity.DynamicProxies.Companyました。

編集:

ビューモデルを使用してビューを設定し、ビジネス ロジックをクライアント側に保持するエンティティを返さないでください。これは悪い習慣であり、場合によっては危険です。

于 2012-07-04T14:29:48.533 に答える
0

私はかつて同様の問題を抱えていましたが、このように手動で行う必要があります

/* Part that is not working */
UnitOfWork unitOfWork = new UnitOfWork();
Companies = unitOfWork.CompanyRepository
         .Get(orderBy: q => q.OrderBy(u => u.CompanyName))
         .Select(x => new Company() 
          {
               fooAttribute = x.fooAtribute
          }).ToList();
于 2012-07-04T14:26:39.223 に答える