ASP.net не генерирует JavaScript для некоторых пользовательских агентов

StackOverflow https://stackoverflow.com/questions/917688

Вопрос

******************** ..Но мне не нравятся последствия.Ранее я тестировал наше мобильное приложение, ориентированное на iPhone, и использовал плагин для маскировки строки пользовательского агента Firefox под iPhone.

.Net на самом деле НЕ генерировал необходимый код для обратной связи только на основе этой части информации.

Однако мне это не нравится, потому что, поскольку iPhone и другие мультимедийные устройства могут интерпретировать javascript, ASP.net нарушает работу любого приложения, которое использует для запуска сгенерированный сервером javascript.

Итак, если сообщество позволит...Я бы хотел изменить свой официальный вопрос на...Почему ASP.net не генерирует JavaScript для определенных браузеров и как отключить эту «функцию».

*************** Конец редактирования 2 ****************

У меня странная проблема.Я скопировал некоторый рабочий код со своего удаленного хоста на свой компьютер на работе.Когда я пытаюсь использовать страницу, я получаю ошибку JavaScript.

__doPostBack is not defined
javascript:__doPostBack('ctl00$ContentPlaceHolder1$login','')()()

Когда я использую исходный код выходной страницы, конечно же, на стороне сервера не существует javascript.

Я попытался создать простую страницу:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="jsTest.aspx.vb" Inherits="_jsTest" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:TextBox ID="tbTest" runat="server"></asp:TextBox><br />
        <asp:LinkButton ID="linkTest" runat="server">LinkButton</asp:LinkButton>
    </form>
</body>
</html>

Код программной части:

Partial Class _jsTest
    Inherits System.Web.UI.Page
    Protected Sub linkTest_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles linkTest.Click
        Response.Write(tbTest.Text)
    End Sub
End Class

Получаю ту же ошибку.

Я попробовал перезагрузиться (эй, в половине случаев это работает), очистил все из App_Code, global.asax и web.config, добавил текстовое поле с autopostback=true...У меня закончились идеи.

Может ли кто-нибудь пролить свет на то, что здесь происходит?

******* •

<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTkxNTA2MDE2NWRkxhZMwlMVwJprcVsvQLJLrTcgaSM=" />

<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
    theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
//]]>
</script>
<div>
    <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWAwK20LZAAuzRsusGAsz0+6YPxxO+Ewv1XsD5QKJiiprrGp+9a3Q=" />
</div>

Хотя источник в Firefox показывает только:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTkxNTA2MDE2NWRkxhZMwlMVwJprcVsvQLJLrTcgaSM=" />

<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWAwK20LZAAuzRsusGAsz0+6YPxxO+Ewv1XsD5QKJiiprrGp+9a3Q=" />

Сохранение веб-страниц на рабочий стол и открытие в блокноте показывает то же самое...

Это было полезно?

Решение

Проблема в том, как ASP.net по умолчанию обрабатывает неизвестные браузеры...например айфон.Хотя было бы неплохо предположить, что неизвестные браузеры могут использовать JavaScript...вы можете указать, какие возможности есть у браузера в разделе web.config илиmachine.config.

Проверить http://slingfive.com/pages/code/browserCaps/ для обновленного файла конфигурации браузера caps для asp.net

Вот пример случая, соответствующего браузерам на базе GECKO (Netscape 6+, Mozilla/Firefox,...)

<case match="^Mozilla/5\.0 \([^)]*\) (Gecko/[-\d]+)(?'VendorProductToken' (?'type'[^/\d]*)([\d]*)/(?'version'(?'major'\d+)(?'minor'\.\d+)(?'letters'\w*)))?">
                browser=Gecko
                <filter>
                    <case match="(Gecko/[-\d]+)(?'VendorProductToken' (?'type'[^/\d]*)([\d]*)/(?'version'(?'major'\d+)(?'minor'\.\d+)(?'letters'\w*)))">
                        type=${type}
                    </case>
                    <case> <!-- plain Mozilla if no VendorProductToken found -->
                        type=Mozilla
                    </case>
                </filter>
                frames=true
                tables=true
                cookies=true
                javascript=true
                javaapplets=true
                ecmascriptversion=1.5
                w3cdomversion=1.0
                css1=true
                css2=true
                xml=true
                tagwriter=System.Web.UI.HtmlTextWriter
                <case match="rv:(?'version'(?'major'\d+)(?'minor'\.\d+)(?'letters'\w*))">
                    version=${version}
                    majorversion=0${major}
                    minorversion=0${minor}
                    <case match="^b" with="${letters}">
                        beta=true
                    </case>
                </case>
            </case>

Другие советы

Прежде чем переустанавливать Firefox, запустите его в режиме отладки (кажется, это называется режимом отладки).Он отключает все плагины, и это может помочь вам немного сузить круг вопросов.А как насчет других браузеров, таких как Chrome или Safari?

Судя по новой информации, думаю, понятно, что это проблема Firefox (возможно, у вас стоит надстройка, блокирующая JS), а не вопрос программирования.Я получаю отличные результаты с вашим кодом, используя VS 2008 и FF3 на XP Pro, как и ожидаю, что большинство других попробует это.

Вы можете попробовать переустановить Firefox, убедиться, что JS работает на всех других сайтах, убедиться, что у localhost нет других разрешений безопасности...

У вас есть AutoEventWireup установлено значение false, но нет переопределения OnInit для прикрепления события.Попробуйте изменить AutoEventWireup к истине.

Редактировать:Судя по дополнительной информации, возможно, что Firefox неправильно идентифицируется в разделе возможностей браузера вашего файла Machine.config.(или web.config).

Также может случиться так, что в Firefox отключен JavaScript, и, таким образом, .NET определяет, что нет смысла отображать материал Javascript, и ему следует использовать другой подход к обработке обратной передачи, если такая вещь существует.

Вы уверены, что на вашем веб-сервере установлен ASP.NET?

Похоже на __doPostBack() функция не генерируется, поскольку у вас нет событий на стороне сервера, которые ее требуют.

ASP.NET предпочитает генерировать функцию __doPostBack() только в том случае, если у вас есть подписанные прослушиватели событий, которым необходимо, чтобы она работала правильно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top