.net MVC2 jQuery не может вызвать действие из контроллера - PullRequest
0 голосов
/ 13 ноября 2010

Привет, я новичок в MVC и jQuery, я следил за примерами, которые нашел в сети, но застрял, у меня на странице есть элемент img, который я пытаюсь добавить с помощью события нажатия jQuery, а затемВызовите действие из моего контроллера.

Моя страница

<asp:Content ID="aboutContent" ContentPlaceHolderID="MainContent" runat="server">
<h2>About</h2>
<p>
    Put content here.
</p>
<img id="img1" alt="some image" src="http://www.google.pl/logos/2010/stevenson10-hp.jpg" />

<script type="text/javascript" language="javascript">
    $("#img1").click(function (e) {
        $.ajax({
            type: "POST",
            url: "Home/CheckAge",
            data: "{}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            async: true,
            cache: false,
            success: function (msg) {
                alert("ok");
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                alert(textStatus+" - "+errorThrown);
            }
        });
        return false;
    });       
</script>

добавлено событие, но когда я нажимаю на изображение, я всегда останавливаюсь наФункция ошибки и оповещение гласят «ошибка - не определено»

мой контроллер выглядит так

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";
        return View();
    }

    public ActionResult About()
    {
        return View();
    }

    public static string Test()
    {
        string name = "aaa";
        return "Hello " + name;
    }

    [HttpPost]
    public JsonResult CheckAge(String code)
    {
        return Json("abc");
    }
}

Я пробовал много комбинаций и многопримеры, но результат всегда один и тот же. Есть идеи, что я делаю не так?Я использую Visual Web Developer 2010 Express

Спасибо за ваш совет

Ответы [ 2 ]

3 голосов
/ 13 ноября 2010

Ваш метод CheckAge принимает параметр:

[HttpPost]
public JsonResult CheckAge(String code)
{
    return Json("abc");
}

Но вы не передаете параметр в AJAX:

data: "{}",

Вам также нужно обернуть код скрипта в $(document).ready():

$(document).ready(function () {
    $("#img1").click(function (e) {
        $.ajax({
            type: "POST",
            url: "Home/CheckAge",
            data: {code: "theCode"},
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            async: true,
            cache: false,
            success: function (msg) {
                alert("ok");
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                alert(textStatus+" - "+errorThrown);
            }
        });
        return false;
    });  
});
0 голосов
/ 13 ноября 2010

Вы устанавливаете contentType = application/json как запрос, но на контроллере нет ничего, чтобы понять это.Связыватель модели по умолчанию работает только со стандартными параметрами строки запроса (application/form-url-encoded).Итак, вы можете попробовать это:

$('#img1').click(function (e) {
    $.ajax({
        type: 'POST',
        url: '<%= Url.Action("CheckAge") %>',
        data: { code: 'some code you want to send' },
        dataType: 'json',
        cache: false,
        success: function (msg) {
            alert(msg.result);
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            alert(textStatus+" - "+errorThrown);
        }
    });
    return false;
}); 

И действие контроллера:

[HttpPost]
public ActionResult CheckAge(string code)
{
    return Json(new { result = "abc" });
}

Обратите внимание, что contentType больше не используется, хеш данных содержит параметр кода, который будет отправлендействие контроллера и URL больше не являются жестко закодированными, но для его вычисления используется URL-помощник.Также действие контроллера возвращает JSON с использованием анонимного объекта.

...