2016-06-29 52 views
0

我有一個工作的創建頁面,它使用JavasScript來拉動各種數據字符串,並在前端顯示它們。MVC 4編輯控制器拋出NullReferenceException當使用.getJSON調用

當我試圖在同一視圖的編輯頁面中實現類似的代碼時,我遇到了一個「NullReferenceException」 - 對象引用未設置爲對象的實例。

下面是在「ProductController的」編輯方法,錯誤是在IF語句拋出:

public ActionResult Edit(int id = 0) 
    { 
     using (ManagePromotion promLogic = new ManagePromotion(ref uow)) 
     using (ManageDistributionRule druleLogic = new ManageDistributionRule(ref uow)) 
     { 
      Product prd = ProductLogic.GetByAndInclude(x => x.ProductID == id, new List<string>() { "AddSamplePacks" }).FirstOrDefault(); 
      ProductVM vm = new ProductVM(prd, (int)System.Web.HttpContext.Current.Session["CustomerID"]); 

      if (vm.Product.AddSamplePacks == null || promLogic.GetById(vm.Product.PromotionID).CustomerID != (int)System.Web.HttpContext.Current.Session["CustomerID"]) 
      { 
       throw new HttpException(404, ""); 
      } 
      return View(vm); 
     } 

    } 

下面也就是我一直在添加到編輯頁面前端的JavaScript,如果我刪除此代碼的頁面運行正常,沒有錯誤:

var input = "comm"; 
    // 
    //alert("HIT"); 
    $.getJSON('getCat', { term: input }, function (result) { 
     var ddl = $('#selectTypeCat'); 
     alert(result); 
     // 
     var length = result.length; 
     ddl.empty(); 

     $(document.createElement('option')) 
       .attr('value', 0) 
       .text("-- Please Select --") 
       .appendTo(ddl); 

     $(document.createElement('option')) 
       .attr('value', 100) 
       .text("All Distribution Rules") 
       .appendTo(ddl); 

     $(result).each(function (jack) { 
      // 
      $(document.createElement('option')) 
       .attr('value', result[jack]) 
       .text(result[jack]) 
       .appendTo(ddl); 
     }); 
    }); 

在產品控制器,它與創建過程中工作得很好,在「getCat」的方法是這樣的:

 public ActionResult getCat(string term)                
    {                         
     int customerId = (int)System.Web.HttpContext.Current.Session["CustomerID"];      
     // 
     //string term = "small";                   
     // 
     var getCat = (from ctype in TypeLogic.GetCustomerProdIndex(customerId, term).List    
         select new { ctype.TypeName, ctype.TypeCategoryID }).ToList();      

     List<String> returnList = new List<string>(); 


     foreach (var item in getCat)                  
     {                        

       returnList.Add(item.TypeName.ToString());                               
     }                        

     returnList = returnList.Distinct().ToList();          
     return Json(returnList, JsonRequestBehavior.AllowGet);           
    } 

任何幫助將不勝感激,謝謝。

+0

請出示「getCat」功能是不是在更新控制器 –

+0

,感謝 – Cooper1810

+0

的根本原因是您嘗試在vm.Product.AddSamplePacks獲得值,其中vm.Product爲空(見我的回答) –

回答

0

我終於體會到了什麼問題。

在我的JavaScript我有一個JSON調用是這樣的:

$.getJSON('getDistributionNameBox', { term: input }, function (result) 

然而,因爲它是一個「編輯」頁它通過HTTP編輯方法自動跑每當這個請求被調用。

FIX:

我,而不是改變了的Javascript我JSON方法的調用,使其顯式調用問題的方法:

$.getJSON('/CustomerArea/Product/getDistributionNameBox', { id: drID }, function (result) 

這意味着編輯方法,不再重新叫並且可以在頁面中多次運行動態JSON請求。

0

你檢查m.Product.AddSamplePacks == null但你不檢查vm.Product是空的。剛剛加入vm.Product == NULL

public ActionResult Edit(int id = 0) 
{ 
    using (ManagePromotion promLogic = new ManagePromotion(ref uow)) 
    using (ManageDistributionRule druleLogic = new ManageDistributionRule(ref uow)) 
    { 
     Product prd = ProductLogic.GetByAndInclude(x => x.ProductID == id, new List<string>() { "AddSamplePacks" }).FirstOrDefault(); 
     ProductVM vm = new ProductVM(prd, (int)System.Web.HttpContext.Current.Session["CustomerID"]); 

     if (vm.Product == null || vm.Product.AddSamplePacks == null || promLogic.GetById(vm.Product.PromotionID).CustomerID != (int)System.Web.HttpContext.Current.Session["CustomerID"]) 
     { 
      throw new HttpException(404, ""); 
     } 
     return View(vm); 
    } 

} 
+0

它也可以''promLogic.GetById(vm.Product.PromotionID).CustomerID'因爲'GetById(...)'可能會返回null。 –

+0

我已經添加了vm.product == null,現在httpexception被拋出。 getJSON請求仍然不會發生。 – Cooper1810

+0

我還有另一個問題,你的代碼現在不會拋出nullReferenceexception –

相關問題