webForumDet fria alternativet

Codebehind och "Object variable or With block variable not set"

11 svar · 565 visningar · startad av m_soderlund

m_soderlundMedlem sedan sep. 20026 425 inlägg
#1

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:

<%@ Page Language="VB" Strict="False" Debug="True" inherits="PL" src="behind/news.aspx.vb" %>

<span class="head">Startsidan</span>

<form id="news" runat="server">
    <asp:repeater id="tbl_news" runat="server">
    <ItemTemplate><%# Container.DataItem("n_date") %><br />
    <%# Container.DataItem("n_news") %><br />
    <%# Container.DataItem("n_name") %><br /><br /></ItemTemplate>
    </asp:repeater>

</form>

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:

Source File: e:\web\pred\behind\news.aspx.vb Line: 26

Stack Trace:

[NullReferenceException: Object variable or With block variable not set.]
Microsoft.VisualBasic.CompilerServices.LateBinding.InternalLateSet(Object o, Type& objType, String name, Object[] args, String[] paramnames, Boolean OptimisticSet, CallType UseCallType) +1994
Microsoft.VisualBasic.CompilerServices.LateBinding.LateSet(Object o, Type objType, String name, Object[] args, String[] paramnames) +28
PL.Page_Load() in e:\web\pred\behind\news.aspx.vb:26
System.Web.Util.ArglessEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +10
System.Web.UI.Control.OnLoad(EventArgs e) +67
System.Web.UI.Control.LoadRecursive() +35
System.Web.UI.Page.ProcessRequestMain() +731

Felet ligger alltså på rad 26 och härrör till tbl_news.DataSource = dbRead.

Nu undrar jag vad problemet är, samt hur man löser det. MYCKET tacksam för hjälp. :D

DinoMedlem sedan sep. 20011 914 inlägg
#2

Skall inte datasourcen kopplas till repeatern.

'bort med
...
Sub Page_Load
   Dim tbl_news As object
...

'in med
...
protected withevents tbl_news as repeater
Sub Page_Load
...

Tycker inte heller direkt om strukturen på default.aspx, men det har antagligen inte med saken att göra.

m_soderlundMedlem sedan sep. 20026 425 inlägg
#3

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?

DinoMedlem sedan sep. 20011 914 inlägg
#4

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
'default.aspx
<%@ Page Language="VB" Strict="True" Debug="True" %>
<%@ Register TagPrefix="BlaBlaBla" TagName="Hihihi" Src="userControls/menu.ascx" %>
<!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">
                        <BlaBlaBla:Hihihi ID="ucMenu" runat="server"/>
                     </td>
                     <td width="5"></td>
                     <td valign="top" width="600">
                        <asp:placeholder id="phSubPage" runat="server"/>
                     </td>
                  </tr>
               </tbody>
            </table>
         </td>
      </tr>
   </tbody>
</table>
</body>
</html>

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.

m_soderlundMedlem sedan sep. 20026 425 inlägg
#5

Tack för att du tog dig tid att skriva om min kod Dino. :)
Men vad är det som gör att din kod är bättre än min?

NETworkMedlem sedan juni 20011 732 inlägg
#6

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

VimpMedlem sedan juli 20022 537 inlägg
#7

Jag har skrivit en artikel om grunderna om usercontrols..

http://www.aspsidan.nu/default.asp?page=readArticle&menu=2&aId=103

m_soderlundMedlem sedan sep. 20026 425 inlägg
#8

Jag läste på lite om usercontrols i en lånad ASP.NET-bok igår och det är ju klart att usercontrols passar bäst i detta fall.

Vad gäller .NET så började jag ordentligt med det för tre veckor sen, och gillar språket skarpt. :D
Tack för era synpunkter, MVH

GladhMedlem sedan maj 20012 812 inlägg
#9

Vad gäller .NET så började jag ordentligt med det för tre veckor sen, och gillar språket skarpt.

Du menar att du gillar FrameWorken. .NET är inget språk utan ett FrameWork. Du kan använda massor med olika språk i .NET :)

- Magnus

m_soderlundMedlem sedan sep. 20026 425 inlägg
#10

Okej, jag uttryckte mig lite plumpt där. ;)
Naturligtvis menar jag att jag gillar .NET, samt gillar C# och VB skarpt. :D

VimpMedlem sedan juli 20022 537 inlägg
#11

Martin.. Vilket språk använder du? C# eller Visual Basic?

m_soderlundMedlem sedan sep. 20026 425 inlägg
#12

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.

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