ASP.net не генерирует JavaScript для некоторых пользовательских агентов - PullRequest
5 голосов
/ 27 мая 2009

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

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

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

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

*************** End Edit 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>

Codebehind:

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 ... У меня нет идей.

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

************** Дополнительная информация ************** Я просто попробовал все снова в IE, и он работает, как и ожидалось, источник страницы показывает:

<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=" />

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

Ответы [ 6 ]

7 голосов
/ 28 мая 2009

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

Проверьте http://slingfive.com/pages/code/browserCaps/ для обновленного файла конфигурации browsercaps для 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>
2 голосов
/ 28 мая 2009

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

1 голос
/ 28 мая 2009

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

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

1 голос
/ 28 мая 2009

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

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

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

0 голосов
/ 27 мая 2009

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

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

0 голосов
/ 27 мая 2009

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

...