[英]How do I access the data returned in an AJAX call with vanilla JavaScript?
[英]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.