2016-08-15 3 views
1

У меня есть Аякса, предназначенный для автоматического завершения текстового поля:Внутренняя ошибка сервера с MVC и Ajax

$(function() { 
    $("#txtSearch").autocomplete({ 
     source: function (request, response) { 
      var param = { movie_name: $('#txtSearch').val() }; 
      $.ajax({ 
       url: '/Home/GetMovieTitles', 
       data: param, 
       dataType: "json", 
       type: "POST", 
       contentType: "application/json; charset=utf-8", 
       dataFilter: function (data) { return data; }, 
       success: function (data) { 
        response($.map(data.d, function (item) { 
         return { 
          value: item 
         } 
        })) 
       }, 
       error: function (XMLHttpRequest, textStatus, errorThrown) { 
        alert(errorThrown); 
       } 
      }); 
     }, 
     minLength: 2 
    }); 
}); 

веб-метод в главном контроллере

[WebMethod] 
    public List<String> GetMovieTitles(string movie_name) 
    { 
     MbdbContext db = new MbdbContext(); 

     List<string> MovieTitle = new List<string>(); 

     foreach (var item in db.Movies.Where(m => m.MovieName.Contains(movie_name)).ToList()) 
     { 
      MovieTitle.Add(item.MovieName.ToString()); 
     } 

     return MovieTitle; 
    } 
} 

Я получаю внутренний сервер ошибка. Есть ли что-то очевидное, что мне не хватает? Где я должен искать?

+0

Он должен иметь сведения об исключении – Shyju

+0

он говорит «локальные хосты говорят: внутренняя ошибка сервера» если я поохотиться некоторой информацией вниз в f12 -> Я считаю «не удался загрузить ресурс HTTP: // локальными/Главная/GetMovieTitles "Сервер ответил на состояние 500 –

+0

Действительно ли вы кодируете в MVC? Зачем вам нужен WebMethod? Это для ASPX-страниц – techspider

ответ

-3

Возможно, преобразование из списка строк в список строк не выполняется. Попробуйте изменить возвращаемый тип метода.

public List<String> GetMovieTitles .... 

Для

public List<string> GetMovieTitles ... 
+0

100% уверен, что строка и строка являются взаимозаменяемыми – Steve

+0

Да, хорошо. Я не знал. Спасибо. Но стоит попробовать –

+0

Да, строка - это объект типа String. То же, что и int является объектом типа Int32. – Baserz

0

Для Ajax вызовов в приложении MVC я использую тип возвращаемого JsonResult вместо списка и т.д.

С вашего возвращения контента в формате JSON

contentType: "application/json; charset=utf-8" 

Возможно, вы захотите попробовать структурировать свой веб-метод следующим образом:

[HttpPost] 
public JsonResult GetMovieTitles(string movie_name) 
{ 
    MbdbContext db = new MbdbContext(); 

    List<string> MovieTitle = new List<string>(); 

    foreach (var item in db.Movies.Where(m => m.MovieName.Contains(movie_name)).ToList()) 
    { 
     MovieTitle.Add(item.MovieName.ToString()); 
    } 

    return Json(MovieTitle, JsonRequestBehavior.AllowGet); 
} 

Просто предложение.

0

[WebMethod] атрибут предназначен для разоблачить метода веб-службы XML (старый ASP путь)

Вам не нужно это, так как вы используете MVC.

[HttpPost] //since you using POST 
public JsonResult GetMovieTitles(string movie_name) 
{ 
    MbdbContext db = new MbdbContext(); 
    //also, it's better refactor to that way: 
    List<string> MovieTitle = db.Movies 
     .Where(m => m.MovieName.Contains(movie_name)) 
     .Select(x=>x.MovieName.ToString()).ToList() 

    return Json(MovieTitle); 
} 

Таким образом, вы не будете перебирать свою коллекцию в памяти, только в БД.

0

Вам не нужно использовать [WebMethod] в MVC

использования.

$.ajax({ 
url: '@Url.Action("GetMovieTitles")', 
//Your Code. 
}) 
Смежные вопросы