När mina sidor ska visa ett felmeddelande genererat av IIS'en så tänds ett lager (div) i html'en för att visa meddelandet. Denna DIV finns alltid latent i htmlkoden och har ett stylesheet satt så att den är osynlig för det mesta.
Mitt problem är: hur kommer jag åt DIV'en med min kod så jag kan sätta en ny css-class på den (så att den tänds när htmlresultatet når webläsaren)??
Vet att tex att <asp:label blablabla> skapar en SPAN tag men finns det någon kontroll som skapar en DIV så jag kan sätta .cssclass = "blablabla" på denna?
Helst vill jag komma åt en div som ligger statiskt i html koden (jag kör code behind med VB) men om detta inte går så måste jag väl skapa den dynamiskt (om ni vet hur)?
Nej, jag vill av olika anledningar ha div'en i koden redan, dvs även om den inte används så ska den finnas i html'en, därför kan jag inte skapa div'en dynamiskt på det där sättet.
DIV ligger på klientsidan och code-behind är på serversidan. Du kommer inte åt några DIV:ar från code-behind förutom när sidan laddas. Av den anledningen finns det inga skäl att ha div:en i koden redan.
Men om du vill det ändå så får du antingen sätta Runat="Server" på DIV:en, använda en Panel, eller använda Javascript.
Rekommenderar Panel.
' Någonstans i dokumentet
response.write "<div id=""feldiv"" style=""display: none;"">Inget fel!</div>"
' Sist i koden:
if (fel) then
response.write "<script type=""text/javsacript"">"
response.write "document.getElementById(""feldiv"").innerHTML = ""Ett fel har visst uppstått..."";"
response.write "document.getElementById(""feldiv"").style.display = ""block"";"
response.write "</script>"
endif
Problemet är att jag kör XHTML (inte strikt dock) och har all layout spec'ad i en CSS fil. Om jag låter alla mina user controlls (som ligger inbäddade i DIV'ar på olika ställen) spy ut ett felmedelande där dom ligger så går det inte att på ett bra sätt bestämma positionen på DIV'en med felmeddelandet (pga att olika div'ar är satta static/absolute/relative etc).
Jag skulle egentligen behöva skicka alla fel till en speciell div på sidan. Är det smartare att ha en speciell usercontrol som tar felmeddelandet som en inparameter och att denna usercontroll alltid ligger inom samma div på alla sidor?
Ok, men hur exakt kommer jag åt div'en via en user controll (code behind)?
Eller om jag kör en usercontroll för att visa meddelanden, hur sätter jag en parameter på densamma ifrån en annan usercontroll (jag har definerat upp Public propertys på den)?
Mina ASPX sidor bygger på samma "ramverk" av div'ar
I många av dessa div'ar ligger usercontrolls.
Jag använder code behind (vb)
Mitt önskemål:
Att i allra största grad kunna slänga ut ett meddelande i en div på aspx sidan, oavsett vart felet genererades. Felet kan komma ifrån min class (dll), min aspx sida eller mina ascx kontroller.
Denna div ligger alltid på samma plats i html koden på samtliga sidor (pga positionering via styles). Jag kan alltså inte bara skriva ut en div därifrån felet genererades (dvs jag kan inte nästla in en dynamiskt skapad div här och där).
Centralisera denna funktion så att jag kan anropa den därifrån jag önskar (på serversidan). Denna funktion ska kunna skriva ut meddelandet i min div (som alltid finns där).
Min fråga:
Var ska funktionen ligga? Går det att lägga den i min generella class som jag använder på varje sida?
Hur ska funktionen smidigast kontakta min div på aspx sidan?
Mitt problem:
Jag är ganska ny på .net! =)
det är mest "Min fråga" jag behöver ett smidigt svar på. Om ni tycker jag är ute och cyklar så kanske ni har ett bra exempel på hur man bättre löser detta problem.
Om jag förstått dig korrekt så har varje .aspx sida en DIV som skall innehålla eventuella fel.
Om du då låter din .ASPX sidan skapa denna DIV-section med hjälp av en ASP:Panel och sätter ID till "divError".
Sedan så har du på din sida en Page_Error() funktion, alltså en funktion som körs när ett fel genereras någonstans i din kod (oavsett var). I denna funktion kan du nu accessa din "divError" panel och sätta texten på den samt att ändra visible till True, så att de kommer att synas på din sida när sidan laddas.
Du har nu på din ASPX sida en DIV section som har ID=divError och som innehåller lite text, med hjälp av ditt CSS kan du placera denna divsection precis var du vill.
Hmm... Kom på en sak, vad menar du med fel. Är det runtime fel från .NET eller är det egna fel som du upptäcker så som att en användar inte finns i databasen eller att man skrivit in för många tecken i en textbox?. För om det är det sista så är min lösning inte så bra...
Om jag förstått dig korrekt så har varje .aspx sida en DIV som skall innehålla eventuella fel.
Om du då låter din .ASPX sidan skapa denna DIV-section med hjälp av en ASP:Panel och sätter ID till "divError".
Sedan så har du på din sida en Page_Error() funktion, alltså en funktion som körs när ett fel genereras någonstans i din kod (oavsett var). I denna funktion kan du nu accessa din "divError" panel och sätta texten på den samt att ändra visible till True, så att de kommer att synas på din sida när sidan laddas.
Du har nu på din ASPX sida en DIV section som har ID=divError och som innehåller lite text, med hjälp av ditt CSS kan du placera denna divsection precis var du vill.
Hmm... Kom på en sak, vad menar du med fel. Är det runtime fel från .NET eller är det egna fel som du upptäcker så som att en användar inte finns i databasen eller att man skrivit in för många tecken i en textbox?. För om det är det sista så är min lösning inte så bra...
- Magnus
Med "fel" menar jag egentligen meddelanden ifrån serversidan som användaren bör få reda på, dvs jag kan skicka vilken text jag vill, så det betyder att inte alla fel ska skickas dit (även info av annat slag...är väl inte så bra att jag måste raisa ett error för att få ut ett meddelande i dessa fall?)
Såfall blir det lite problem. Hur du än vrider och vänder på det så kommer du inte få någon bra avkoppling mellan dina olika lager i din design om du önskar göra som du vill. Det jag kan tänka mig är att man använder sig av ett temporärt lagringsställe (typ databas) och från de olika ställena som du skriva ut dina "fel" så skriver du ner till databasen.
När sidan sedan skall renderas i typ PreRender eventet så kontrollerar du i databasen om det finns någon text för just denna besökare (hur du skall få det unikt vet jag inte riktigt än :)) och om det finns data där, så skrivs den ut i din DIV som redan är placerad på sidan.
Det kommer dock inte bli någon bra lösning eftersom du önskar kunna göra det från varsom helst. Första instinkt var att spara det i en sessionvariable, men om du skall kunna skriva från dina egna klasser till en sessionvariable så får du ingen bra designlösning av ditt system. Tror du får riktigt svårt att hitta någon bra och snygg lösning på ditt problem, det finns ju några mindre bra.
När sidan sedan skall renderas i typ PreRender eventet så kontrollerar du i databasen om det finns någon text för just denna besökare (hur du skall få det unikt vet jag inte riktigt än :)) och om det finns data där, så skrivs den ut i din DIV som redan är placerad på sidan.
Sessionsid är väl unikt? =P
Nu har jag iofs fått lära mig att just felhantering ska ske så enkelt som möjligt; det sista man vill är väl att felhanteringen får fel, exempelvis att databasen inte svarar i detta fall... =)
Men kan någon förklara vad som kommer åt vad? Det snurrar i skallen nu:
Class -> ASPX: kontroller?
ASCX -> Annan ASCX?
ASCX -> ASPX: kontroller?
Känns bara så naturligt att ha 1 funktion, smidigast i min class, för att få ut ett felmeddelande....
Det snyggaste sättet att lösa det på, är att alla dina klasser och controller har ett event som det slänger iväg när du har något fel i de som du vill att ett överliggande lager skall få tag i. Alltså om du har en aspx sidan som har en instans av din klass, så känner din sida till klassen men klassen känner inte till sidan. Det betyder att man kan skicka information från sidan till klassen men inte från klassen till sidan (om inte sidan begär det). Så det man gör när man är i klassen och vill att sidan skall få reda på det är att man kastar ett event och så är det sidans uppgift att fånga detta event och gör något med det.
Mellan de olika controllerna så är det också snyggast att låta en kontroll kasta ett event som sidan fångar som sedan skickar den datan vidare till nästa kontroll. Så att sidan känner till båda kontroller men kontrollerna känner inte till varandra. Det måste bli det snyggaste och bästa sättet, även om det blir lite mer kodning.
- magnus
142 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe