2016-06-29 2 views
0

У меня есть рабочая страница создания, которая использует JavasScript для перемещения по различным строкам данных и отображения их на лицевой стороне.MVC 4 Edit Controller throwing NullReferenceException при использовании вызова .getJSON

Когда я попытался реализовать аналогичный код на странице редактирования того же представления, меня встречает «Исключение NullReferenceException» - Object Reference, не установленное для экземпляра объекта.

Ниже приведен метод Edit в «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) 

Однако, поскольку это была страница «Edit» автоматически пробежал метод редактирования HTTP, когда этот запрос был вызван.

FIX:

вместо этого я изменил вызов моего метода JSON в JavaScript, так что он явно вызвал метод в вопросе:

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

Это означало метод редактирования больше не отозвавшим и динамический запрос JSON может выполняться несколько раз на странице.

0

вы проверяете m.Product.AddSamplePacks == null, но вы не проверяете vm.Product null. просто добавьте 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 –

Смежные вопросы