Jag håller på att göra en sajt där informationen som visas baseras på vilken info som tas emot från default.aspx?category=xxx&subcat=xxx och har nu stött på ett fel i samband med codebehind.
Så här ser min codebehindsida ut:
news.aspx.vb
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.Page
Imports System.Web.UI.Control
Imports System.Data
Imports System.Data.OleDb
Public Class PL : Inherits Page
Sub Page_Load
Dim tbl_news As object
Dim Cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("dbms\db_news.mdb"))
Dim SQL As string = "SELECT n_name,n_news,n_date FROM tbl_news"
Dim Cm As New OleDbCommand(SQL,Cn)
Dim dbRead As OleDbDataReader
Dim Container As object
Cn.Open()
dbRead = Cm.ExecuteReader()
tbl_news.DataSource = dbRead '<--- det är där felet ligger!!
tbl_news.DataBind()
dbRead.Close()
Cn.Close()
End Sub
End Class
Sidan som klassen och infon från databasen ska visas på heter main.aspx och ser ut så här:
Slutligen har vi sidan default.aspx, där, beroende på info i subcat-querystringen, exekveras en sida. Så här ser default.aspx ut:
<%@ Page Language="VB" Strict="True" Debug="True" %>
<%
Dim cat As string = Request.Querystring("category")
Dim subcat As string = Request.Querystring("subcat")
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Predictive Sales</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link href="style.css" type="text/css" rel="stylesheet" />
</head>
<body>
<table cellspacing="1" cellpadding="2" border="0">
<tbody>
<tr>
<td><img alt="Predictive Sales" src="gfx/logo.gif" border="0" /></td>
</tr>
<tr>
<td>
<table cellspacing="0" cellpadding="0" border="0">
<tbody>
<tr>
<td valign="top">
<!--#include file="menu.aspx"-->
</td>
<td width="5"></td>
<td valign="top" width="600">
<%
Select Case subcat
Case ""
Server.Execute("main.aspx")
Case "main"
Server.Execute("main.aspx")
Case "company"
Server.Execute("about/aboutcompany.aspx")
Case "companyculture"
Server.Execute("about/companyculture.aspx")
Case "management"
Server.Execute("about/management.aspx")
Case "vdspeaks"
Server.Execute("about/vdspeaks.aspx")
Case "aboutservices"
Server.Execute("services/aboutservices.aspx")
Case "fieldsales"
Server.Execute("services/fieldsales.aspx")
Case "telesales"
Server.Execute("services/telesales.aspx")
Case "telemarketing"
Server.Execute("services/telemarketing.aspx")
Case "salesconsulting"
Server.Execute("services/salesconsulting.aspx")
Case "abouttechnology"
Server.Execute("tech/abouttechnology.aspx")
Case "predictivedialer"
Server.Execute("tech/predictivedialer.aspx")
Case "telestarcms"
Server.Execute("tech/telestarcms.aspx")
Case "aboutcustomers"
Server.Execute("customers/aboutcustomers.aspx")
Case "canaldigital"
Server.Execute("customers/canaldigital.aspx")
Case "foraldranatet"
Server.Execute("customers/foraldranatet.aspx")
Case "ap-fastigheter"
Server.Execute("customers/ap-fastigheter.aspx")
Case "monster"
Server.Execute("customers/monster.aspx")
Case "staffphilosophy"
Server.Execute("recruitment/staffphilosophy.aspx")
Case "workforus"
Server.Execute("recruitment/workforus.aspx")
Case "unoccupiedjobs"
Server.Execute("recruitment/unoccupiedjobs.aspx")
Case "contact"
Server.Execute("contact.aspx")
Case Else
Server.Execute("404.aspx")
End Select
%>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</body>
</html>
Nu är det så att jag får följande problem när jag kör default.aspx?category=main&subcat=main och alltså exekverar main.aspx och den sidans codebehind-sida. Följande felmeddelande genereras:
Object variable or With block variable not set.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.NullReferenceException: Object variable or With block variable not set.
Source Error:
Line 24: dbRead = Cm.ExecuteReader()
Line 25:
Line 26: tbl_news.DataSource = dbRead
Line 27: tbl_news.DataBind()
Line 28:
Tackar så mycket, ska testa det senare. Men vad jag tycker är lite halvkrångligt med ASP.NET (och ändå har jag SDK:n) är att hitta rätt typ för respektive variabler. :(
Varför gillar du inte min struktur i default.aspx Dino?
Re: Codebehind och "Object variable or With block variable not set"
'Code-behind (default.aspx.vb)
protected withevents phSubPage as placeholder
Sub Page_Load(sender as object, e as eventargs)
If not ispostback then
bind()
end if
end sub
sub bind()
Dim cat As string = Request.Querystring("category")
Dim subcat As string = Request.Querystring("subcat")
Select Case subcat
Case ""
phSubPage.Controls.Add(Page.LoadControl("userControls/main.ascx"))
Case "main"
phSubPage.Controls.Add(Page.LoadControl("userControls/main.ascx"))
Case "company"
phSubPage.Controls.Add(Page.LoadControl("userControls/aboutcompany.ascx"))
Case "companyculture"
phSubPage.Controls.Add(Page.LoadControl("userControls/companyculture.ascx"))
Case "management"
phSubPage.Controls.Add(Page.LoadControl("userControls/management.ascx"))
Case "vdspeaks"
phSubPage.Controls.Add(Page.LoadControl("userControls/vdspeaks.ascx"))
Case "aboutservices"
phSubPage.Controls.Add(Page.LoadControl("userControls/aboutservices.ascx"))
Case "fieldsales"
phSubPage.Controls.Add(Page.LoadControl("userControls/fieldsales.ascx"))
Case "telesales"
phSubPage.Controls.Add(Page.LoadControl("userControls/telesales.ascx"))
Case "telemarketing"
phSubPage.Controls.Add(Page.LoadControl("userControls/telemarketing.ascx"))
Case "salesconsulting"
phSubPage.Controls.Add(Page.LoadControl("userControls/salesconsulting.ascx"))
Case "abouttechnology"
phSubPage.Controls.Add(Page.LoadControl("userControls/abouttechnology.ascx"))
Case "predictivedialer"
phSubPage.Controls.Add(Page.LoadControl("userControls/predictivedialer.ascx"))
End Select
end sub
Först gör jag om menu.aspx till en userControl(menu.ascx) och registerar den på sidan. Har sen tagit all logik och lagt in den i default.aspx code-behind. Alla dina undersidor har gjorts om till userControls. Och i code-behind så kollas vilken sida som skall visas och den userControlen lägger jag till på sidan via en placeholder.
Sträva efter att skilja presentation och logik och glöm allt vad renderingstaggar heter.
Du har gjort någon mystisk asp - asp.net-hybrid och det blir en enda soppa. Till skillnad från asp så har du här tillgång till ett riktigt programmeringsspråk skiljt från presentationslagret. Dessa ska ALDRIG blandas, du får annars en hemskt dålig och rörig struktur att arbeta med. Regel nummer 1 när du hoppar på .net är således att aldrig skriva kod i presentationslagret. Anledningen till att du tycker det är halvkrångligt beror ju just på det faktum att du GÖR det krångligt. :)
Det är en liten tröskel innan du kommer in i det nya tänket, men när du väl har gjort det sätter du dig inte gärna framför gammal asp igen...
Vad gäller usercontrols så är det ett utmärkt sätt att återanvända kod/funktionalitet/presentation. Glöm allt vad includefiler heter, det är inte alls samma sak... här har du en programmerbar klass att arbeta med och implementationen är oerhört smidig! Har du samma kod på två ställen så har du gjort fel...
Jag använder mestadels Visual Basic.NET, men har dessa veckor kodat parallellt - samma sak i VB.NET först, och sen samma sak i C# - allt för att lära mig.
271 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25