Расширьте IsAjaxRequest(), чтобы включить запросы API на выборку.

В настоящее время я создаю сайт с использованием MVC5, и мне нужно обслуживать другой контент при выполнении запроса ajax.

Обычно мы используем jQuery и делаем ajax-запрос с помощью $.ajax, но в последнее время мы перешли на использование fetch API. Однако запросы, использующие fetch API, не регистрируются в MVC как запросы ajax, поэтому используется неправильный шаблон.

Я думал о том, чтобы сделать собственное расширение запроса ajax, но не уверен, какой заголовок проверять:

    public static bool IsAjaxOrFetchRequest(this HttpRequestBase request)
    {
        if (request != null && request.Headers != null)
        {
            if (request.Headers["Custom-Fetch-Header"] != null)
            {
                return true;
            }
        }

        return request.IsAjaxRequest();
    }

Есть ли заголовок, который fetch отправляет со всеми запросами, такими как Request.Headers["X-Requested-With"] == "XMLHttpRequest" ajax?

Пройдясь по коду, я не увидел ничего особенного.


person Pete    schedule 17.11.2017    source источник
comment
Браузеры всегда добавляют заголовок запроса Origin к запросам на выборку и запросам XHR, которые отправляются из разных источников.   -  person sideshowbarker    schedule 17.11.2017
comment
@sideshowbarker, к сожалению, они происходят с одного и того же сайта   -  person Pete    schedule 17.11.2017


Ответы (1)


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

const request = new Request(url, {
  headers: new Headers({
    'X-Is-Ajax-Request': 'True'
  })
});

return fetch(request)
  .then(html => {
    const $result = $(html);
    const $content = $result.filter('.js-sidebar-panel-content');
    return $content.length ? $content : $result;
  });

Затем я смог обновить свое расширение с помощью:

public static bool IsAjaxOrFetchRequest(this HttpRequestBase request)
{
    if (request != null && request.Headers != null)
    {
        if (request.Headers["X-Is-Ajax-Request"] != null)
        {
            return bool.Parse(request.Headers["X-Is-Ajax-Request"]);
        }
    }

    return request.IsAjaxRequest();
}
person Pete    schedule 17.11.2017
comment
Это работает фантастически! Но я в замешательстве, почему вы потрудились обновить расширение, а не использовать расширение IsAjaxRequest() по умолчанию и отправить {X-Requested-With: XMLHttpRequest}, как отправляют другие фреймворки? - person webMan1; 04.10.2018
comment
Таким образом, я мог определить разницу между запросом ajax и запросом на выборку, если бы мне нужно было - person Pete; 05.10.2018