Javascript 在MVC视图中,如何访问由ajax调用调用的控制器返回的数据

Javascript 在MVC视图中,如何访问由ajax调用调用的控制器返回的数据,javascript,jquery,asp.net-mvc,asp.net-ajax,Javascript,Jquery,Asp.net Mvc,Asp.net Ajax,我有一个MVC 5视图,其中包含以下JavaScript,在调用控制器上的操作方法后出现错误: <script type="text/javascript"> $('#ddlvendors').change(function () { var descHtml = ""; var vendorId = $(this).val(); $.ajax(

我有一个MVC 5视图,其中包含以下JavaScript,在调用控制器上的操作方法后出现错误:

<script type="text/javascript">
    $('#ddlvendors').change(function () {
                var descHtml = "";
                var vendorId = $(this).val(); 

                $.ajax(
                    {
                        type: "POST",
                        data: { vendorId: vendorId },
                        url: '@Url.Action("PurchaseOrderVendor")',
                        datatype: "json",
                        success: function (aVendorObject) {
                            alert(aVendorObject.Name);
                        },
                        error: function (req, status, error) {
                            alert(error);
                        }
                     });
            });
</script>
返回的供应商对象如下所示:

[HttpPost]
public ActionResult PurchaseOrderVendor( int vendorId)
{
  Vendor aVendor=VendorServices.GetVendor(vendorId);

  return Json(aVendor);
}
 public class VendorViewModel
  {
    public int VendorId { get; set; }
    public string Name { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string ZipCode { get; set; }
    public string Description { get; set; }
    public string ContactName { get; set; }
    public string Phone { get; set; }
  }
使用Visual Studio 2017调试器,我可以看到在控制器端正确填充了供应商数据。如果我不尝试访问任何成员数据,ajax调用将在没有错误的情况下完成。但是,当我尝试访问任何作为aVendorObject(如aVendorObject.Name)输入的部件时,我会收到一个浏览器错误,显示为“内部服务器错误”。如何修复ajax调用中的成功处理程序,以便访问从控制器返回的供应商对象的成员


提前感谢。

EntityFramework 6的LazyLoading功能在需要时没有可用的供应商对象。我在VendorServices类中添加了一行来关闭懒散加载,从而解决了这个问题。下面是我为这个特定的VendorService方法关闭懒散加载的方法:

 static public Vendor GetVendor(int aVendorId)
{
  Vendor vendor;
  using (RgmSiteDAL RgmSiteDALCtx = new RgmSiteDAL())
  {
    //** Now setting LazyLoadingEnabled to false.
    RgmSiteDALCtx.Configuration.LazyLoadingEnabled = false;

    vendor = RgmSiteDALCtx.Vendor
                .Where(v => v.VendorId == aVendorId)
               .FirstOrDefault<Vendor>();

  }
    return vendor;
}
静态公共供应商getvendorid(int-aVendorId)
{
供应商;
使用(RgmSiteDAL rgmsitedaltx=new RgmSiteDAL())
{
//**现在将LazyLoadingEnabled设置为false。
rgmsitedaltx.Configuration.LazyLoadingEnabled=false;
供应商=rgmsitedaltx.vendor
.其中(v=>v.VendorId==aVendorId)
.FirstOrDefault();
}
退货供应商;
}
我发现,如果包含供应商实体定义的任何导航属性,我也可以修复该问题,如下所示:

vendor = RgmSiteDALCtx.Vendor
                   .Where(v => v.VendorId == aVendorId)
                   .Include(v => v.PurchaseOrder) //because is in Vendor navigation property
                  .FirstOrDefault<Vendor>();
vendor=rgmsitedaltx.vendor
.其中(v=>v.VendorId==aVendorId)
.Include(v=>v.PurchaseOrder)//因为在供应商导航属性中
.FirstOrDefault();

对于我的情况,我将坚持第一个解决方案,它将LazyLoadingEnabled设置为false。这是因为从现有数据库生成实体的选项将我的PurchaseOrder表设置为我的供应商的导航属性,我认为这是不正确的。当我查询供应商信息时,我的供应商对象不需要PurchaseOrder实体中的任何内容。我将研究如何从我的供应商实体中删除PurchaseOrder导航属性,因为我认为它是由Visual Studio中的“从数据库创建实体”工具错误设置的。

通过按浏览器上的
F12
转到
网络
部分。然后执行
ddlvindor.change()
事件。您将看到失败请求的红色文本。单击它,然后导航到
响应
选项卡。您将在那里看到实际的错误!谢谢使用F12揭示了这个问题。这是一个实体框架问题,它使用延迟加载的默认行为。当我关掉lazyloading时,数据就如预期的那样通过了。我将用一个示例来回答这个问题,说明我如何在lazyloading设置为off的情况下修改实体框架调用。