2016-01-06 23 views
1

пытается создать каскадное dropdownmenu с jsonresult и ajax, но я не могу понять, почему я получаю 500 Internal Server Error. Ошибка возникает над следующим способом:500 Внутренняя ошибка сервера JsonResult mvc asp.net

[HttpGet] 
    public JsonResult GetModels(string brandID="") 
    { 
     List<Model> models = new List<Model>(); 
     int ID = 0; 
     if (int.TryParse(brandID, out ID)) 
     { 
      using (CarsEntities1 dc = new CarsEntities1()) 
      { 
     models = dc.Models.Where(a => a.Brand_ID == ID).OrderBy(a =>a.Model_name).ToList(); 
      } 
     } 
     if (Request.IsAjaxRequest()) 
     { 

      return new JsonResult 
      { 
       Data = models, 
       JsonRequestBehavior = JsonRequestBehavior.AllowGet 
      }; 
     } 
     else 
     { 
      return new JsonResult 
      { 
       Data = "Not valid request", 
       JsonRequestBehavior = JsonRequestBehavior.AllowGet 
      }; 
     } 
    } 

я использую метод передать список элементов в DropDownMenu и попытаться вывести список с помощью следующего кода:

$(document).ready(function() { 
     //if (typeof ($) == 'function') alert('jQuery is loaded.'); 
     $("#brand_Brand_ID").change(function() { 
      // this will call when Brand Dropdown select change 
      var brandID = parseInt($("#brand_Brand_ID").val()); 
      if (!isNaN(brandID)) { 
       var ddModel = $("#Model_ID"); 
       ddModel.empty(); // this line is for clear all items from Model dropdown 
       ddModel.append($("<option></option").val("").html("Select model")); 
       // Here I will call Controller Action via Jquery to load Model for selected Brand 
       $.ajax({ 
        url: "@Url.Action("GetModels","ModelSpec")", 
        type: "GET", 
        data: { brandID: brandID }, 
        dataType: "json", 
        success: function (data) { 
         if (data != null && data.success) { 
          $.each(data, function (i, val) { 
           ddModel.append(
             $("<option></option>").val(val.Model_ID).html(val.Model_name) 
            ); 
          }); 
         } 
        }, 
        error: function() { 
         alert("Fail"); 

        } 
       }); 
      } 
     }); 
    }); 

Все я получаю является следующие: GET http://localhost:2508/ModelSpec/GetModels?brandID=2 500 Внутренняя ошибка сервера jquery-1.7.1.js (строка 8102)

Также я заметил, что ошибка не возникает, когда нет данных, проходящих через метод GetModels. И иногда я получаю: GET/ModelSpec/GetModels? BrandID = 5 401 Несанкционированный

Как только GetModels возвращает что-либо, ошибка возникает иначе.

The ObjectContext instance has been disposed and can no longer be used for operations that require a connection

StackTrace: http://pastebin.com/3aXg7YiM

+2

Не могли бы вы вставить описание ошибки? Он будет доступен в обратном вызове ошибки или даже с помощью инструментов разработчика. – gustavodidomenico

+0

Кроме того, вы можете поместить контрольные точки в действие, чтобы увидеть, где он не работает. –

+0

Вы можете заменить 'string brandID =" "' в объявлении метода на 'int brandID'. Затем вы можете удалить этот элемент управления: 'int.TryParse (brandID, out ID)'. Возможно, это решит проблему, но, вероятно, нет. Не могли бы вы попробовать? – erikscandola

ответ

1

Вы должны переместить возвращаемое значение внутри с помощью блока Контекст Db расположен перед возвращением выполняется оператор

public JsonResult GetModels(int brandID) 
{ 
    List<Model> models = new List<Model>(); 

    using (CarsEntities1 dc = new CarsEntities1()) 
    { 
     models = dc.Models.Where(a => a.Brand_ID == brandID).OrderBy(a =>a.Model_name); 
     if (Request.IsAjaxRequest()) 
     { 
      return new JsonResult 
      { 
       Data = models.ToList(), 
       JsonRequestBehavior = JsonRequestBehavior.AllowGet 
      }; 
     } 
    } 

    return new JsonResult 
    { 
     Data = "Not valid request", 
     JsonRequestBehavior = JsonRequestBehavior.AllowGet 
    };  
} 
+0

Пробовал это, но ничего не изменилось. –

0

JSON возвращаемый тип должен быть примитивным, поэтому я соответствующим образом изменил код (swap List to String [] и OrderBy для выбора:

public JsonResult GetModels(int brandID) 
{ 
String[] models; 

using (CarsEntities1 dc = new CarsEntities1()) 
{ 
    models = dc.Models.Where(a => a.Brand_ID == brandID).Select(a=> a.Model_name).toArray(); 
    if (Request.IsAjaxRequest()) 
    { 
     return new JsonResult 
     { 
      Data = models, 
      JsonRequestBehavior = JsonRequestBehavior.AllowGet 
     }; 
    } 
} 

return new JsonResult 
{ 
    Data = "Not valid request", 
    JsonRequestBehavior = JsonRequestBehavior.AllowGet 
};  
} 
Смежные вопросы