2016-12-18 2 views
2

Я хотел бы знать, почему функция, вызванная AJAX, не работает в этом сценарии? Предполагается, что FillObj() вызывается при изменении выбора dropdownlist.Функция ASP.NET MVC Ajax не работает?

<div class="form-group"> 
     @Html.LabelFor(model => model.Module, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.DropDownListFor(model => model.Module, new SelectList(Model.ModuleList, "Value", "Text"), 
    "- Please select a Module -", new { @onchange = "FillObj()", @class = "form-control" }) 
     </div> 
    </div> 

Как вы можете видеть, у меня уже есть @onchange набор для FillObj() в Dropdownlist коде. Однако, когда выбор меняется, он продолжает идти до alert('A error') вместо успеха. Ниже приводится AJAX function:

function FillObj() { 
    var moduleID = $('#Module').val(); 
    $.ajax({ 
     url: '/Questions/FillObjectives', 
     type: "GET", 
     dataType: "JSON", 
     data: { module: moduleID }, 
     success: function (objectives) { 
      $("#objective").html(""); // clear before appending new list 
      $.each(objectives, function (i, Obj) { 
       $("#objective").append(
        $('<option></option>').val(Obj.ObjectiveId).html(Obj.objective)); 
      }); 
     }, 
     error: function() { 
      alert('A error'); 
     } 

    }); 
} 

Контроллер:

public ActionResult FillObjectives(int module) 
{ 
    var objectives = db.Objectives.Where(o => o.ModuleId == module); 
    return Json(objectives, JsonRequestBehavior.AllowGet); 
} 

EDIT 1:

Хорошо, я сделал некоторые отладки и выяснили, что это сообщение произошла ошибка, когда функция вызывается :

enter image description here

В любом случае, чтобы исправить это?

+1

делает действие контроллера получает называется, проверить использование точки останова с помощью отладчика? –

+0

и используйте 'Url.Action' для URL-адресов вроде:' url: '@ Url.Action («FillObjectives», «Questions»)' ' –

+0

Параметр контроллера ожидает целое число. Попробуйте изменить его на строку: FillObjectives (строковый модуль) –

ответ

1

Пожалуйста, смотрите редактирование ниже EDIT 1

Если вы вызываете свои действия с помощью GET, то вы не можете передавать данные в теле. Вы не можете это сделать:

data: { module: moduleID }, 

Вы можете добавить его в конец URL-адреса в качестве строки запроса.

url: '/Questions/FillObjectives?module=' + moduleID, 

Или вы можете изменить вызов POST но убедитесь, что ваши действия не HttpGet атрибут применяется к нему.

EDIT 1

Благодаря комментариям Стивен Муеке, выше я сказал, что для GET операции data { module: moduleID } не должно быть сделано. Это наполовину верно. И поскольку этот ответ несколько раз был поддержан, я разделяю это, так что другие люди, которые находятся под одним и тем же впечатлением, будут знать, что это не так. Это не сработает, если что-то уже опубликовано уже string. Если это не строка, jQuery преобразует ее в строку и добавляет ее в URL. Это из jQuery docs:

Данные, которые следует отправить на сервер. Он преобразуется в строку запроса, если не является уже строкой. Он добавляется к URL-адресу для запросов GET.

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

Таким образом, в заключение, код, отправленный в этом вопросе, будет работать, но причина, по которой это происходит, заключается в том, что код в контроллере ошибочен.Если вы сделаете это в контроллере, он будет идти к успеху на стороне клиента:

public ActionResult FillObjectives(int module) 
{ 
    var data = new[]{ new { ObjectiveId = 1, objective = "Option 1" }, new { ObjectiveId = 2, objective = "Option 2" } }; 
    return Json(data, JsonRequestBehavior.AllowGet); 
} 

Так что вопрос, скорее всего, с этой строкой коды:

var objectives = db.Objectives.Where(o => o.ModuleId == module); 
+0

Конечно,' данные: {module: moduleID}, 'работает для GET –

+0

. Я так не думаю. См. [Здесь] (http://stackoverflow.com/questions/978061/http-get-with-request-body) и [здесь] (http://stackoverflow.com/questions/10298899/how-to-send- данные в-запрос тело с-а-получить когда-используя-JQuery-Ajax). Почему вы говорите, что это работает - я хотел бы знать. – CodingYoshi

+0

Ваша попытка попробовать сначала :) И обратитесь к этому [DotNetFiddle] (https://dotnetfiddle.net/Lk6qQe), чтобы доказать это. –

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