webForumDet fria alternativet

Kan inte läsa variabel från Include?

.NET

9 svar · 321 visningar · startad av CokeLight

Medlem sedan juni 2000504 inlägg
Frågan#1

Hej,

Från Include filen requestar jag en querystring, och lägger resultatet i en variabel. (Includen ligger högst uppe i sidan). Men sen när jag läser in den variabeln i den sida som har include filen ger denna kod

<td valign="top"><img src="<%=imgPath2%>" border="0"></td>

detta resultat:

Compiler Error Message: BC30451: Name 'imgPath2' is not declared.

Jag har alltid gjort så i vanliga ASP och kör fortfarande vanlig ASP, med skillnaden att jag nu börjar med *.aspx istället för att successivt flytta om till .NET kod... det ska väl vara samma i ASP.NET eller är det mest troligt att jag gjort nåt slarvfel?

Kör jag response.write på variablen från include filen så läser den rätt så långt... Varför säger den "not declared"?

Medlem sedan juni 2000504 inlägg
#2

Struntade i Include o la allt i samma sida, men dock kvarstår felet med "not declared".

Sen vart det lite skumt för att jag provade med server img istället:

<asp:Image src='<%=imgPath2%>' runat="server"/>

Provade lite olika syntax hit o dit, o sen slutade den klaga på not declared, men däremot blev det väldigt konstigt när man kollar "View Source" på browsern:

<img src="<%=imgPath2%>" border="0" />

Alltså man ser ju ASP taggarna o bilden hittas inte så klart.. nu känns det ännu knepigare.. någon...? :)

Medlem sedan juni 20011 732 inlägg
#3

<img src="<%=imgPath2%>" border="0" />

Detta är ingen bra lösning, glöm, glöm, glöm! :) Försök... nej förresten, inte försök... du SKA alltid använda asp.net-kontroller istället för att blanda html med gamla asp-variabler på det där sättet.

För det andra, i en <asp:image> så sätter du sourcen med ImageUrl="blah.gif", inget annat.

För det tredje, sätt sourcen till bilden i koden!

MinBild.ImageUrl = minQuerystring;

Funkar det ändå inte, prova att skriva ut variabeln med response.write för att kolla att du verkligen har hämtat din querystring:

Response.Write(minQuerystring.ToString());
Medlem sedan juni 2000504 inlägg
#4

ja, va bra att du svarade :)

nu förstod jag dock inte riktigt syntaxen.. menar du så här eller?

<asp:Image ImageUrl='<%=imgPath2%>' runat="server"/>

Källkoden från View Source gav då detta:

<img src="/Index/<%=imgPath2%>" border="0" />

det som är nytt är /Index (roten katalogen). (Konstigt att man ser <%%> tecken dock.. ? :)

Sen förstod jag heller inte riktigt

MinBild.ImageUrl = minQuerystring; <-- var skriver jag detta ?

<asp:Image ImageUrl=imgPath2 runat="server"/> så eller..? hehhe.. blev lite förvirrad.. det som är konstigt är att allt efter ImageUrl behandlas som text/ascii o inte som serverkod av nån anledning..?

Jag sitter fortfarande o testar men tänkte det var bäst o skriva ändå medan du är här.. :)

Medlem sedan juni 2000504 inlägg
#5

(tänkte bara posta koden där requesten körs.. inga konstigheter tror jag.. )

så här ser det ut mitt i röran i alla fall..

<%
	dim Location
	
	dim imgPath1, imgPath2  AS String'major images
	dim imgTxt1, imgTxt2 ' text images
	
	Location = request.querystring("Location")
	
	response.write( "querystring: " & Location.ToString() )
	
	IF Location = "" THEN
		Location 	= "Home"
	END IF
	
	
	IF Location = "Home" THEN
		imgPath1 	= "/Index/Images/Home/WomanSuit.jpg"
		imgPath2 	= "/Index/Images/Home/SpringFlower.jpg"
		
		imgTxt1 	= "/Index/Images/Text/txtintroduction.jpg"
		imgTxt2		= "/Index/Images/Text/txtLearning.jpg"
	ELSE 
		imgPath1 	= "No path set"
		imgPath2 	= "/Index/Images/Home/CityNight.jpg"
	END IF
	
	response.write("<br>imgPath2: " & imgPath2)
%>

och man får ut rätt imgPath2 när man kör däruppe, men inte när jag sätter den i <asp:Image>

Medlem sedan juni 20011 732 inlägg
#6

Du försöker använda gammal asp-kod tillsammans med asp.net och det fungerar inte. Du kan inte skriva ut en .net-variabel i en gammal asp-tagg, den kommer aldrig att exekveras som du märkte. Om du nu tvunget vill använda den här typen av kod så ska du skriva <%# %> istället, alltså med ett #-tecken. Det ser ungefär likadant ut, men logiken bakom är helt annorlunda.

Men det finns naturligtvis ett mycket bättre sätt att lösa detta. En av grundpelarna med asp.net är ju att du INTE ska blanda design och kod! Nu kan jag inte vb.net tyvärr, men logiken är väl ungefär densamma som i c# som jag använder. Det du ska göra är att tilldela attributet ImageUrl på din asp:image till den variabel som innehåller sökvägen till bilden. Men först måste du sätta ett id på din asp:image-kontroll, exempelvis <asp:image id="minBild" runat="server>. Sen är det bara att sätta imageurlen till din variabel:

minBild.ImageUrl = imgPath;
Medlem sedan juni 2000504 inlägg
#7

hehhe.. alright.. äntligen !! :)) stort tack.. det där med # hittade jag också, men då fick man det där med "not declared" igen.. men strunt samma för tillfället.. man skulle tydligen använda det om vid ex databas förfrågningar, t.ex

td><asp:Image height=100 width=100
Img src='<%# Container.DataItem("imgPath")%>'
runat="server"/>

kul att man lärde sig nåt då.. har lite fler frågor egentligen.. hmm.. kanske ska börja en ny tråd.. :)

Medlem sedan juni 20011 732 inlägg
#8

Code declaration blocks define member variables and methods that will be compiled into the generated Page class. These blocks can be used to author page/navigation logic. The following example demonstrates how a Subtract method can be declared within a <script runat="server"> block, and then invoked from the page.

<script language="C#" runat=server>
int subtract(int num1, int num2) {
return num1 - num2;
}
</script>

<%
...
number = subtract(number, 1);
...
%>

Unlike ASP - where functions could be declared within <% %> blocks - all functions and global page variables must be declared in a <script runat=server> tag. Functions declared within <% %> blocks will now generate a syntax compile error.

Du kan alltså inte deklarera en variabel i en gammal asp-renderblock utan du måste göra det i koden, alltså mellan dina <script> </script>-taggar (eller i din vb-fil om du använder codebehind).

Fick du det att fungera förresten? En bra referens i början är quickstarten, där finns alla fakta man behöver första månaderna!

http://www.dotnetjunkies.com/quickstart/aspplus/

Medlem sedan juni 2000504 inlägg
#9

Aha.. var det därför.. jag hade problem ganska länge just pga variabler som jag trodde var (globala) ändå sades vara "not declared".. jättesnällt att du skrev detta.. !

Jodå, jag fick det o funka efter att jag fattade hur jag skulle använda

minBild.ImageUrl = imgPath;

som du skrev..

hmm.. fast en sak jag undrar är varför det inte verkar finnas nån direkt motsvarighet till javascripts OnMouseOver i en HREF:

<a href="/Index/default.aspx?Location=XML" 
	onMouseOver="window.status='Learning XML'; 
	cmdXML.src='/Index/Images/cmdXMLOver.jpg';
	return true"
onMouseOut="cmdXML.src='/Index/Images/cmdXML.jpg'; self.status=''; return true">
						<img src="/Index/Images/cmdXML.jpg" border="0" name="cmdXML"></a>

Jag provade med asp:Imagebutton o HTMLImage plus diverse kombinationer men utan nåt bra resultat.. slutligen gjorde jag om taggarna så exakt som jag kunde efter den gamla modellen:

<asp:HyperLink id="Menu1" runat="server"
	NavigateUrl="/Index/default.aspx?Location=Home"
	onmouseover="imgMenu1.src='/Index/Images/cmdHomeOver.jpg'; window.status='Home'; return true"
	onmouseout="imgMenu1.src='/Index/Images/cmdHome.jpg'; window.status=''; return true">							
						<asp:Image name="imgMenu1" ImageUrl="/Index/Images/cmdHome.jpg" runat="server"/></asp:HyperLink>

o då gick det till slut, men det är ju ganska meningslöst eftersom man inte vunnit nåt på o göra om koden så...? Men i alla fall så hittade jag till slut detta:

Use the Attributes collection of your HtmlImage control, ex.:
[C#]
HtmlImage img = new HtmlImage();
img.Attributes.Add("onmouseover","alert('mouse is over')");
img.Attributes.Add("onmouseout","alert('mouse is out')");

Men tyvärr (ehm) kunde jag inte komma på hur man skulle implementera det så att det passade med just min kod..? Så som jag förstod det kan man ju blanda C# o VB.NET lite som man vill utan att det ska störa.. så det borde väl gå, eller...? :)

Medlem sedan juni 2000504 inlägg
#10

Hej, provade lite nyss o kom på hur man skulle använda koden.. det var ju inte så konstigt iofs.. dock funkar det inte i NS.. :/

  <script language="C#" runat="server">
       void Button2_Click(object Source, ImageClickEventArgs e) {
	  	InputImage2.Attributes.Add("onmouseover","this.src='/Index/Images/cmdXMLOver.jpg'");
		InputImage2.Attributes.Add("onmouseout","this.src='/Index/Images/cmdXML.jpg'");
		 Span1.InnerHtml="You clicked button 2";
       }
    </script>

<input type=image id="InputImage2" src="/Index/Images/cmdXML.jpg"
            OnServerClick="Button2_Click"
            runat="server">

koden ovan ger dessutom samma resultat som

<input type=image id="InputImage2" src="/images/mango.jpg"
            onmouseover="this.src='/images/banana.jpg';"
            onmouseout="this.src='/images/mango.jpg';"
            OnServerClick="Button2_Click"
            runat="server">

(Enligt SDK dokumentationen står det dessutom så här) :

Events that occur often (and can be raised without the user knowing it), such as an onmouseover event, are not supported for server controls.

Jag kom dessutom på att jag gjorde helt fel att använda request.querystring() från gamla ASP.. det räcker ju med o skapa en sub som svarar på knapptryckning.. det stämmer väl, eller? Så istället för att använda

/folder/minfil.aspx?var=param o sen kolla med var = request.querystring("var")
if var = x then 
'visa innehåll för sida 1
else if var= y then 
'visa innehåll för sida 2 
osv

så kan man använda <span id="mySpan"> o sen i en sub skriva att event för knapp1 eller länk1 anropar subX
subX
mySpan.text= "värde från nån datakälla"
bild1 = imgSrc1
bild2 = imgSrc2
osv
end sub

för att på detta sätt generera nya sidor när användaren klickar på en länk? Är det så man gör eller skickar man fortfarande parametrar a la mypage.asp?str1=something ? Om ja, hur skulle man isåfall veta värdet på denna sträng utan request.querystring() ?

vet inte om det gick att förstå vad jag menade.. kanske ska sova o tänka vidare imorgon :)

268 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
130 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)