Есть ли Request.IsMvcAjaxRequest () эквивалентный для jQuery? - PullRequest
8 голосов
/ 14 ноября 2008

Я предпочитаю использовать jQuery с моими приложениями ASP.NET MVC, чем с библиотекой Microsoft Ajax. Я добавил параметр под названием «mode» в мои действия, которые я установил в своих вызовах ajax. Если это предусмотрено, я возвращаю JsonViewResult. Если он не предоставлен, я предполагаю, что это был стандартный пост Http, и я возвращаю ViewResult.

Я хотел бы иметь возможность использовать что-то похожее на IsMvcAjaxRequest в моих контроллерах при использовании jQuery, чтобы я мог исключить дополнительный параметр в моих действиях.

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

Ответы [ 4 ]

12 голосов
/ 31 января 2009

Вот исключение из примечаний к выпуску MVC RC1 - январь 2009

IsMvcAjaxRequest переименован в IsAjaxRequest

Метод IsMvcAjaxRequest был переименован в IsAjaxRequest. Как часть это изменение, метод IsAjaxRequest был обновлен, чтобы распознать X-Requested-With HTTP заголовок. Это хорошо известный заголовок, отправленный майором Библиотеки JavaScript, такие как Prototype.js, jQuery и Dojo.

Помощники ASP.NET AJAX были обновлены для отправки этого заголовка в Запросы. Тем не менее, они продолжают и отправьте его в теле формы разместить, чтобы обойти проблему брандмауэров, которые раздеваются неизвестно Заголовки.

Другими словами - он был специально переименован, чтобы быть более «совместимым» с другими библиотеками.

Кроме того, для тех, кто еще не прочитал полные заметки о выпуске , но использовал предыдущие версии - даже такие последние, как бета-версия - я STRONGLY рекомендую прочитать их полностью. Это сэкономит вам время в будущем и, скорее всего, поразит вас некоторыми новыми функциями. Удивительно, сколько там нового материала.

Важное примечание: Вам необходимо убедиться, что вы обновляете файл .js для MicrosoftAjax.MVC (не точное имя) при обновлении до RC1 из бета-версии - в противном случае этот метод не будет работать. Он не указан в заметках о выпуске как обязательное задание для обновления, поэтому не забудьте.

4 голосов
/ 14 ноября 2008

См. Ответ Саймонса ниже. Описанный здесь метод больше не нужен в последней версии ASP.NET MVC.

В настоящее время работает метод расширения IsMvcAjaxRequest, который проверяет Request["__MVCASYNCPOST"] == "true" и работает только тогда, когда метод является запросом HTTP POST.

Если вы делаете запросы HTTP POST через jQuery, вы можете динамически вставить значение __MVCASYNCPOST в ваш запрос, а затем воспользоваться преимуществом метода расширения IsMvcAjaxRequest.

Вот ссылка на источник метода расширения IsMvcAjaxRequest для вашего удобства.

Кроме того, вы можете создать клон метода расширения IsMvcAjaxRequest, который называется IsjQueryAjaxRequest, который проверяет Request["__JQUERYASYNCPOST"] == "true", и вы можете динамически вставить это значение в HTTP POST.

Обновление

Я решил пойти дальше и дать этому шанс, вот что я придумал.

Метод расширения

public static class HttpRequestBaseExtensions
{
    public static bool IsjQueryAjaxRequest(this HttpRequestBase request)
    {
        if (request == null)
            throw new ArgumentNullException("request");

        return request["__JQUERYASYNCPOST"] == "true";
    }
}

Проверка по действию, является ли метод запросом jQuery $ .ajax ():

if (Request.IsjQueryAjaxRequest())
    //some code here

JavaScript

$('form input[type=submit]').click(function(evt) {
    //intercept submit button and use AJAX instead
    evt.preventDefault();

    $.ajax(
        {
            type: "POST",
            url: "<%= Url.Action("Create") %>",
            dataType: "json",
            data: { "__JQUERYASYNCPOST": "true" },
            success: function(data) {alert(':)');},
            error: function(res, textStatus, errorThrown) {alert(':(');}
        }
    );
});
3 голосов
/ 26 ноября 2008

Почему бы вам просто не проверить HTTP-заголовок "X-Requested-With", автоматически отправляемый большинством библиотек Javascript (например, jQuery)?

Имеет значение «XMLHttpRequest» при отправке запроса GET или POST.

Для того, чтобы проверить это, вам нужно просто проверить NameValueCollection «Request.Headers» в вашем действии, то есть:

if (Request.Headers["X-Requested-With"] == "XMLHttpRequest")
    return Json(...);
else
    return View();

Таким образом, вы можете просто отличать обычные запросы браузера от запросов Ajax.

0 голосов
/ 26 ноября 2008

Хорошо, я сделал еще один шаг и изменил свой файл jQuery, чтобы загрузить дополнительный параметр в данные публикации, поэтому мне не нужно повторять «__JQUERYASYNCPOST: true» для каждого вызова публикации. Для всех, кто интересуется, вот как выглядит мое новое определение $ .post:

post: function(url, data, callback, type) {
            var postIdentifier = {};
            if (jQuery.isFunction(data)) {
                callback = data;
                data = {};
            }
            else {
                postIdentifier = { __JQUERYASYNCPOST: true };
                jQuery.extend(data, postIdentifier);
            }

            return jQuery.ajax({
                type: "POST",
                url: url,
                data: data,
                success: callback,
                dataType: type
            });
        }

Я добавил переменную postIdentifier, а также вызов jQuery.extend. Теперь помощник объяснил, как работает ответ ложки 16, не добавляя ничего особенного в мой код jQuery на уровне страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...