Выполнять действие, только если javascript отключен

Я хотел бы выполнить действие MVC, только если javascript отключен. Чтобы попытаться достичь этой цели, я добавил тег <noscript> в свой html:

<noscript>
    @Html.Action("BlogRss", "Home")
</noscript>

В моем контроллере следуйте за действием

public PartialViewResult BlogRss()
{
     return PartialView("_BlogRss", GetFeeds());
}

Проблема в том, что тег <noscript> не влияет на невыполнение действия. То же самое делается с включенным javascript или без него!

Я знаю, что все, что находится внутри <noscript>, не будет отображаться, если включен JavaScript.


person ridermansb    schedule 11.11.2011    source источник
comment
почему сервер должен заботиться о том, отключен ли JavaScript?   -  person zzzzBov    schedule 11.11.2011
comment
Он должен выполнять действие, только если JavaScript отключен. В противном случае он будет загружен через JavaScript   -  person ridermansb    schedule 11.11.2011


Ответы (3)


<noscript> — это тег HTML, а не тег сервера, и он будет работать только на стороне клиента. Сервер всегда будет отображать / выполнять любой код, который вы поместите между ним, - клиент просто не будет отображать / выполнять его.

Не существует хороших способов определить, включен ли у клиента JavaScript или нет со стороны сервера. Наиболее реалистичным способом было бы использовать javascript/AJAX для установки скрытого значения или файла cookie (document.cookie), а затем использовать это значение/файл cookie на стороне сервера.

@if (!IsJavascriptEnabled) {
    <noscript>
        @Html.Action("BlogRss", "Home")
    </noscript>
}
person Johannes Kommer    schedule 11.11.2011
comment
Как я могу сделать это в asp.net mvc? Я создал его с помощью javascript: document.cookie = c_name + = + c_value Действия на стороне сервера в Response.Cookies ничего не возвращают. Это правильно? - person ridermansb; 11.11.2011
comment
Он ничего не вернет по самому первому запросу (страница должна перейти к клиенту для начала, прежде чем JavaScript сможет установить файл cookie), однако он будет работать для любых последующих запросов. - person Johannes Kommer; 11.11.2011

Если вам нужно простое решение на стороне клиента, я предлагаю обновление META.

<noscript>
        <meta http-equiv="refresh" content="0; url=http://appUrl/BlogRss/">
</noscript>
person Ray Cheng    schedule 11.11.2011
comment
Я не понимаю, что это делает? Как это устроено? - person ridermansb; 11.11.2011
comment
@Riderman de Sousa Barbosa, если javascript клиентского браузера отключен, он будет обновляться с URL-адресом, который выполняет запрос GET Action OP. - person Ray Cheng; 11.11.2011
comment
Да, но мне нужно сделать запрос и вернуть только один PartialView, а не перенаправлять весь сайт на новый URL. @Html.Action("BlogRss", "Home") не перенаправляет весь сайт на новый URL; - person ridermansb; 11.11.2011
comment
@Riderman de Sousa Barbose, если вы хотите получить частичный вид, я не знаю, как это сделать. Но я не думаю, что решение J.Kommer будет работать, потому что нет возможности установить скрытое значение или файл cookie на стороне клиента, когда javascript отключен в браузере клиента. - person Ray Cheng; 11.11.2011
comment
@RayCheng В некотором смысле вы правы, я не определяю, отключен ли JavaScript - я предполагаю, что он отключен, и проверяю, включен ли он, используя JavaScript для установки значения / файла cookie, который затем считывается на стороне сервера. - person Johannes Kommer; 11.11.2011
comment
@RayCheng, решение J.Kommer работает отлично, потому что с помощью javascript я создаю файл cookie, а в asp.net mvc я создал фильтр, который проверяет, установлен ли этот файл cookie. Если это так, это означает, что JavaScript включен. - person ridermansb; 11.11.2011
comment
@Ridermansb, спасибо за объяснение. Теперь я понимаю. - person Ray Cheng; 21.12.2013

Это может быть достигнуто, если вы установите строку запроса по умолчанию, например «js = отключено», а затем перенаправите URL-адрес без этой переменной, только если JS включен. Я знаю, что это немного плохо (перенаправление), но я вижу в этом единственное решение.

person Eliseu Monar dos Santos    schedule 11.11.2011