webForumDet fria alternativet

Komma åt div'ar

17 svar · 777 visningar · startad av desdecado

desdecadoMedlem sedan juli 2004206 inlägg
#1

Har ett litet problem:

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

nitro2k01Medlem sedan aug. 20039 342 inlägg
#2

Typ:

if fel then
  response.write "<div>felmeddelande</div>"
endif

??

desdecadoMedlem sedan juli 2004206 inlägg
#3

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.

PDahlenMedlem sedan apr. 2004778 inlägg
#4

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.

nitro2k01Medlem sedan aug. 20039 342 inlägg
#5

Så här då?

 
' 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
desdecadoMedlem sedan juli 2004206 inlägg
#6

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?

PaceMedlem sedan juni 20019 024 inlägg
#7

Gör som PDahlen skriver, sätt runat="server" på <div>en så kommer du åt den via codebehind. Då kan du sätta felmeddelande som du vill.

Jag tror du kan fånga fel i user controls med Page_Error (under System.Web.UI.Page alltså).

desdecadoMedlem sedan juli 2004206 inlägg
#8

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

VimpMedlem sedan juli 20022 537 inlägg
#9

Du deklarerar den som en System.Web.UI.HTMLGenericControl i din code behind.

desdecadoMedlem sedan juli 2004206 inlägg
#10

Vimp skrev:

Du deklarerar den som en System.Web.UI.HTMLGenericControl i din code behind.

Hmmm, jag kommer inte åt System.Web.UI.HTMLGenericControl

Var det rätt som du skrev?

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#11

Det ska vara så här

System.Web.UI.HtmlControls.HtmlGenericControl
icaaqMedlem sedan okt. 20005 273 inlägg
#12

Varför inte göra som PDahlen sa och använda en <asp:panel> som blir en div när den renderas?

mv icaaq

desdecadoMedlem sedan juli 2004206 inlägg
#13

Jag får förklara lite mer (men kortfattat).

Här är lite fakta för att klargöra problemet.

  1. Mina ASPX sidor bygger på samma "ramverk" av div'ar
  2. I många av dessa div'ar ligger usercontrolls.
  3. Jag använder code behind (vb)

Mitt önskemål:

  1. 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.
  2. 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).
  3. 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:

  1. Var ska funktionen ligga? Går det att lägga den i min generella class som jag använder på varje sida?
  2. Hur ska funktionen smidigast kontakta min div på aspx sidan?

Mitt problem:

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

GladhMedlem sedan maj 20012 812 inlägg
#14

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

desdecadoMedlem sedan juli 2004206 inlägg
#15

Gladh skrev:

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

GladhMedlem sedan maj 20012 812 inlägg
#16

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.

- Magnus

desdecadoMedlem sedan juli 2004206 inlägg
#17

Gladh skrev:

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

GladhMedlem sedan maj 20012 812 inlägg
#18

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

129 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)