ASP.NET MVC и jQuery с TempData - PullRequest
       7

ASP.NET MVC и jQuery с TempData

3 голосов
/ 26 апреля 2009

У меня есть ссылка в одном из моих представлений, которую пользователи могут щелкнуть, которая вызывает ActionResult. Ссылка примерно такая:

<a class="do_something" href="#">lorem ipsum</a>

Затем у меня есть некоторый javascript, который отправляет в ActionResult (данные не передаются в ActionResult), например:

$("a.do_something").click(function() {
   var urltopost = "/foo";

   $.post(urltopost);
   return false;
});

ActionResult предназначен для того, чтобы затем что-то сделать, например:

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult foo()
    {
        //do something here

        TempData["Success"] = "You have successfully done something";
        return RedirectToAction("Index", "Home");
    }

Я хочу, чтобы, когда пользователь щелкает ссылку, ActionResult делает свое дело, а затем перенаправляет пользователя в другое представление, отображая сообщение TempData, информирующее их о том, что все работает правильно.

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

Вопрос в том, как я могу перенаправить пользователя в нужное представление, когда что-то происходит в ActionResult? Лучше ли перенаправлять из jQuery (если так, как это можно сделать)?

Ответы [ 2 ]

4 голосов
/ 26 апреля 2009

Ваш javascript просто вызывает действие контроллера, но он ничего не делает с возвращаемым значением (в данном случае html из представления, на которое он перенаправляет).

Вы должны создать функцию обратного вызова и заменить текущий html возвращаемым html из вызова javascript $ .post ().

В качестве примера, вот мой код, который отправляет форму в действие контроллера, которое возвращает частичное представление:

            var f = $("#FilterProfile");
            var action = f.attr("action");
            var serializedForm = f.serialize();
            $.post(action,
                serializedForm,
                function(data) {
                    $("tbody").html(data);
                });

Ваш код должен выглядеть примерно так:

                    $.post("/foo",
                      function(data) {
                          $("html").replaceWith(data);
                      });

Я не проверял, но вы должны получить изображение. Если в вашем браузере FF установлен firebug, вы можете увидеть, что возвращает метод $ .post ().

Если вы хотите выполнить «реальное» перенаправление и позволить пользователю использовать кнопку «Назад», вы также можете заставить $ .post () возвращать URL-адрес представления, на которое нужно перенаправить, а затем использовать location.href = data; сделать перенаправление.

2 голосов
/ 26 апреля 2009

Почему ты даже просто за это? Просто попросите ссылку перейти прямо к действию (используя GET).

<a class="do_something" href='/foo'>lorem ipsum</a>

[AcceptVerbs( HttpVerbs.Get )]
public ActionResult foo()
{
   // do something

   TempData["Success"] = "You have successfully done something";
   return RedirectToAction("Index","Home");
}

Я мог бы увидеть, как это делается с помощью jQuery, если действие является длительным действием, и вы хотите предоставить спиннер или что-то, что будет указывать на то, что работа продолжается, но для большинства действий я бы просто подключил ссылку к действию. Если у вас есть длительное действие, тогда я получу ваш успешный обратный вызов для сообщения, просто установите для location.href правильный URL-адрес, а действие вернет текстовое сообщение или html (для ошибок и т. д.). Я думаю, что вам нужно использовать метод ajax, чтобы получить сообщение об ошибке, tho.

$("a.do_something").click(function() {
   var urltopost = "/foo";

   $.post(urltopost, null, function() { location.href = "/home"; } );
   return false;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...