2009-05-27 14 views
5

******************** Modifica 2 *************** ******* Ho capito il problema ... Ma non mi piacciono le implicazioni. Stavo testando la nostra applicazione mobile con targeting per iPhone in precedenza e utilizzando un plug-in per mascherare la stringa dell'agente utente di Firefox come un iPhone.ASP.net non genera javascript per alcuni agenti utente

. NET non era infatti in grado di generare il codice richiesto per i postback basati solo su quella parte di informazioni.

Tuttavia non mi piace, perché poiché l'iPhone e altri dispositivi multimediali sono in grado di interpretare javascript, ASP.net interrompe qualsiasi applicazione basata sul javascript generato dal server.

Quindi, se la comunità lo consentirà ... Vorrei cambiare la mia domanda ufficiale su ... Perché ASP.net non genera javascript per browser specifici e come posso disattivare questa "funzione".

*************** End Edit 2 ***************

Ho un problema strano. Ho copiato alcuni codici funzionanti dal mio host remoto al mio computer al lavoro. Quando cerco di utilizzare la pagina che sto ottenendo un errore javascript

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

Quando ho pochi il sorgente della pagina di uscita, abbastanza sicuro non c'è lato server generato javascript.

Ho cercato di creare una semplice pagina:

<%@ 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 

Ottenere lo stesso errore.

Ho provato a riavviare (hey, funziona la metà del tempo), eliminato tutto da App_Code, global.asax e web.config, aggiunto una casella di testo con autopostback = true ... Sono fuori di idee.

Qualcuno può far luce su quello che sta succedendo qui?

************** Altre informazioni ************** Ho appena provato di nuovo tutto in IE e funziona come previsto, la pagina fonte mostra:

<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> 

Mentre la fonte in Firefox mostra solo:

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

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

Salvataggio delle pagine web sul desktop e l'apertura nel blocco note rivela la stessa cosa ...

+0

Sto facendo qualche ricerca ... Sembra che sia qualcosa che è possibile risolvere con una sezione in web.config o machine.config. Per impostazione predefinita, i browser sconosciuti vengono trattati come vecchi browser incapaci di javascript. – Birk

risposta

7

Il problema è il modo predefinito in cui ASP.net tratta browser sconosciuti ... come l'iPhone. Anche se sarebbe bello presumere che i browser sconosciuti potessero usare javascript ... è possibile specificare quali funzionalità ha un browser nella sezione di web.config o machine.config.

Partenza http://slingfive.com/pages/code/browserCaps/ per un browserCaps aggiornati file di configurazione per asp.net

Ecco un esempio di un caso in modo che corrisponda GECKO Based Browser (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> 
+0

Mi hai battuto per questo - BrowserCaps sono davvero il problema qui - Si potrebbe voler controllare http://owenbrady.net/browsercaps/ è più recentemente aggiornato per entrambi 1.1 e 2.0 - oggetti di scena per http://stackoverflow.com/ domande/431765/asp-net-request-browser-crawler-dynamic-crawler-list/431991 # 431991 per questo. –

0

Sei sicuro hai ASP.NET installato sul tuo server web?

+0

Sì, sto utilizzando Visual Studio 2008 9.0.30729 Framework 3.5 SP1 – Birk

0

Sembra che la funzione __doPostBack() non venga generata perché non sono presenti eventi lato server che lo richiedono.

ASP.NET desidera generare solo la funzione __doPostBack() quando si dispone di listener di eventi che ne avrebbero bisogno per funzionare correttamente.

+0

Sub link protettoTest_Click (ByVal sender As Object, ByVal e As System.EventArgs) Gestisce linkTest.Click C'è il gestore dell'evento ... e come ho detto , quando era sul mio computer di casa, e il mio server web funzionava correttamente. – Birk

+0

Whoops, ho trascurato il fatto che stavi usando un LinkButton. Stavo pensando che era un controllo Button, che non ha bisogno del metodo __doPostBack(), se ricordo male. Inoltre, poiché AutoEventWireup è falso, non sembra che quel metodo sarebbe legato al controllo da solo, ma qualcun altro ha già detto che ... –

1

Hai AutoEventWireup impostato su falso, ma non Override di OnInit per allegare l'evento. Prova a cambiare AutoEventWireup in true.

Modifica: dalle informazioni aggiuntive potrebbe essere che identifica erroneamente Firefox nella sezione delle funzionalità brower di machine.config. (o web.config).

Potrebbe anche essere che JavaScript sia disattivato in Firefox, e quindi .NET sta determinando che non è necessario eseguire il rendering dei file Javascript, e dovrebbe utilizzare un approccio diverso alla gestione del postback, se esiste una cosa del genere.

+0

Nessun cambiamento ... buon suggerimento però. – Birk

1

In base alle nuove informazioni, penso che sia chiaro che si tratta di un problema di Firefox (forse si dispone di un componente aggiuntivo che blocca JS) e non di una domanda di programmazione. Ottengo risultati eccellenti con il tuo codice utilizzando VS 2008 e FF3 su XP Pro, come mi aspetterei che chiunque altro lo provasse.

si può provare a reinstallare Firefox, assicurarsi che JS funziona su tutti gli altri siti, assicurarsi localhost non dispone di diverse autorizzazioni di protezione ...

2

Prima di reinstallare Firefox, eseguirlo in modalità debug (penso che sia chiamato modalità di debug). Spegne tutti i plugin e questo può aiutarti a restringere un po '. Che dire di altri browser come Chrome o Safari?

+0

Ho capito il problema (e ho modificato la domanda) Era un plug-in di spoofing di user-agent che ho usato per i test. Anche se non sono felice per niente, questo è stato il problema. – Birk

+0

Almeno hai trovato la risposta! – Gromer