2

这是我的问题一步一步,

1-我从我的外部javascript文件中获取ajax请求,如下所示,

$.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 获取请求不成功并警告错误消息。

但是,如果我首先从 db 中获取并在 ViewModel 中创建 Company 对象并将它们分配给我的 List,则 ajax 工作正常,并且 ajax get 请求返回成功。当我在 ViewModel 上创建对象时,公司实体的类型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 回答