MVC 4编辑控制器在使用.getJSON调用时抛出NullReferenceException

时间:2016-06-29 10:42:13

标签: json entity-framework asp.net-mvc-4 controller

我有一个工作创建页面,它使用JavasScript来处理各种数据字符串并在前端显示它们。

当我尝试在同一视图的编辑页面中实现类似的代码时,我遇到了一个" NullReferenceException" - 对象引用未设置为对象的实例。

下面是" ProductController"中的Edit方法,错误在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);
        });
    });

&#34; getCat&#34; Product Controller中的方法与创建过程完美配合,如下所示:

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

非常感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分: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);
    }

}

答案 1 :(得分:0)

我终于意识到问题所在。

在我的JavaScript中,我有一个看起来像这样的JSON调用:

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

然而,因为它是&#34;编辑&#34;页面在调用此请求时会自动运行HTTP编辑方法。

FIX:

我改为在Javascript中调用了我的JSON方法,以便明确调用有问题的方法:

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

这意味着不再重新调用edit方法,并且可以在页面内多次运行动态JSON请求。