簡體   English   中英

如何訪問從 MVC 視圖中的 ajax 調用調用的控制器返回的數據

[英]How do I access data returned from a controller invoked by an ajax call in an MVC View

我有一個帶有以下 JavaScript 的 MVC 5 視圖,在調用控制器上的操作方法后出現錯誤:

<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 調用中修復我的成功處理程序,以便我可以訪問從控制器返回的 Vendor 對象的成員?

提前致謝。

EntityFramework 6 的 LazyLoading 功能在需要時沒有提供 Vendor 對象。 我在 VendorServices 類中添加了一行以關閉解決問題的 LazyLoading。 下面是我為這個特定的 VendorService 方法關閉 LazyLoading 的方法:

 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;
}

我發現如果我包含使用 Vendor 實體定義的任何導航屬性,我也可以解決這個問題,如下所示:

vendor = RgmSiteDALCtx.Vendor
                   .Where(v => v.VendorId == aVendorId)
                   .Include(v => v.PurchaseOrder) //because is in Vendor navigation property
                  .FirstOrDefault<Vendor>();

對於我的情況,我將堅持使用第一個將 LazyLoadingEnabled 設置為 false 的解決方案。 這是因為從我現有的數據庫生成我的實體的選項將我的 PurchaseOrder 表設置為我的供應商的導航屬性,我認為這是不正確的。 當我查詢供應商信息時,我的供應商對象不需要來自 PurchaseOrder 實體的任何內容。 我將研究從我的供應商實體中刪除 PurchaseOrder 導航屬性,因為我認為它是由 Visual Studio 中的數據庫工具創建實體錯誤設置的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM