Как вызвать функции контроллера с помощью JQuery в ASP.NET MVC
Я читал об этом некоторое время и обнаружил, что вы можете вызвать действие контроллера, используя:
$.ajax("MyController/MyAction", function(data) {
alert(data);
});
Означает ли это, что я должен добавить MicrosoftMvcAjax.js или MicrosoftAjax.js вместе с Jquery lib?
Кроме того, что должен иметь второй параметр в функции $.ajax()?
Наконец, любая другая ссылка в stackoverflow или за пределами сайта, которая может быть полезна в asp.net mvc w/ajax и jquery?
Спасибо.
Ответы
Ответ 1
Вы можете начать читать здесь jQuery.ajax()
На самом деле действие контроллера - это общедоступный метод, доступ к которому можно получить через URL. Таким образом, любой вызов Action из вызова Ajax может быть сделан либо MicrosoftMvcAjax, либо jQuery. Для меня jQuery - самый простой. В приведенной выше ссылке было много примеров. Типичный пример для вызова ajax выглядит следующим образом.
$.ajax({
// edit to add steve suggestion.
//url: "/ControllerName/ActionName",
url: '<%= Url.Action("ActionName", "ControllerName") %>',
success: function(data) {
// your data could be a View or Json or what ever you returned in your action method
// parse your data here
alert(data);
}
});
Дополнительные примеры можно найти в здесь
Ответ 2
предыдущий ответ - только ASP.NET
вам нужна ссылка на jquery (возможно, из CDN): http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.5.1.js
а затем аналогичный блок кода, но проще...
$.ajax({ url: '/Controller/Action/Id',
success: function(data) { alert(data); },
statusCode : {
404: function(content) { alert('cannot find resource'); },
500: function(content) { alert('internal server error'); }
},
error: function(req, status, errorObj) {
// handle status === "timeout"
// handle other errors
}
});
Я добавил некоторые необходимые обработчики, 404 и 500 случаются все время, если вы отлаживаете код. Кроме того, многие другие ошибки, такие как тайм-аут, будут отфильтрованы через обработчик ошибок.
Контроллеры ASP.NET MVC обрабатывают запросы, поэтому вам просто нужно запросить правильный URL-адрес, и контроллер подберет его. Этот пример кода работает в среде, отличной от ASP.NET
Ответ 3
Мы можем легко вызвать метод контроллера с помощью Javascript/Jquery следующим образом:
Предположим, что следующий метод Controller, который должен быть вызван, возвращает массив некоторых объектов класса. Пусть класс "A"
public JsonResult SubMenu_Click(string param1, string param2)
{
A[] arr = null;
try
{
Processing...
Get Result and fill arr.
}
catch { }
return Json(arr , JsonRequestBehavior.AllowGet);
}
Ниже приведен комплексный тип (класс)
public class A
{
public string property1 {get ; set ;}
public string property2 {get ; set ;}
}
Теперь было вызвано вызовом над контроллером JQUERY. Ниже приведена функция JQuery для вызова метода контроллера.
function callControllerMethod(value1 , value2) {
var strMethodUrl = '@Url.Action("SubMenu_Click", "Home")?param1=value1 ¶m2=value2'
$.getJSON(strMethodUrl, receieveResponse);
}
function receieveResponse(response) {
if (response != null) {
for (var i = 0; i < response.length; i++) {
alert(response[i].property1);
}
}
}
В приведенной выше функции JQuery 'callControllerMethod' мы разрабатываем URL-адрес контроллера контроллера и помещаем его в переменную с именем 'strMehodUrl' и вызываем метод getJSON JQuery API.
receieveResponse - это функция обратного вызова, получающая ответное или возвращаемое значение метода контроллеров.
Здесь мы использовали JSON, так как мы не можем использовать объект класса С#
непосредственно в функцию javascript, поэтому мы преобразовали результат (arr) в методе контроллера в объект JSON следующим образом:
Json(arr , JsonRequestBehavior.AllowGet);
и возвратил этот объект Json.
Теперь в функции обратного вызова Javascript/JQuery мы можем использовать этот результирующий объект JSON и работать соответственно, чтобы отображать данные ответа в пользовательском интерфейсе.
Для получения дополнительной информации нажмите здесь
Ответ 4
В ответ на вышеприведенное сообщение я думаю, что эта строка нужна вместо вашей строки: -
var strMethodUrl = '@Url.Action("SubMenu_Click", "Logging")?param1='+value1+' ¶m2='+value2
Или вы отправляете фактические значения строк1 и value2 в контроллер.
Однако для меня он только вызывает контроллер один раз. Кажется, что каждый раз нажимает "receieveResponse", но точка останова на методе контроллера показывает, что он попадает только 1 раз до обновления страницы.
Вот рабочее решение. Для страницы cshtml: -
<button type="button" onclick="ButtonClick();"> Call »</button>
<script>
function ButtonClick()
{
callControllerMethod2("1", "2");
}
function callControllerMethod2(value1, value2)
{
var response = null;
$.ajax({
async: true,
url: "Logging/SubMenu_Click?param1=" + value1 + " ¶m2=" + value2,
cache: false,
dataType: "json",
success: function (data) { receiveResponse(data); }
});
}
function receiveResponse(response)
{
if (response != null)
{
for (var i = 0; i < response.length; i++)
{
alert(response[i].Data);
}
}
}
</script>
И для контроллера: -
public class A
{
public string Id { get; set; }
public string Data { get; set; }
}
public JsonResult SubMenu_Click(string param1, string param2)
{
A[] arr = new A[] {new A(){ Id = "1", Data = DateTime.Now.Millisecond.ToString() } };
return Json(arr , JsonRequestBehavior.AllowGet);
}
Вы можете видеть изменение времени каждый раз, когда оно вызывается, поэтому нет кеширования значений...
Ответ 5
Вы можете легко вызвать любое действие контроллера с помощью jQuery AJAX, например:
Примечание. В этом примере мое имя контроллера Студент
Действие контроллера
public ActionResult Test()
{
return View();
}
В Любой вид этого выше контроллера вы можете вызвать действие Test(), как это:
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.0.3.min.js"></script>
<script>
$(document).ready(function () {
$.ajax({
url: "@Url.Action("Test", "Student")",
success: function (result, status, xhr) {
alert("Result: " + status + " " + xhr.status + " " + xhr.statusText)
},
error: function (xhr, status, error) {
alert("Result: " + status + " " + error + " " + xhr.status + " " + xhr.statusText)
}
});
});
</script>