login  Naam:   Wachtwoord: 
Registreer je!
 Forum

MVC C# - Object reference not set to an instance of an object (Opgelost)

Offline Wijnand - 27/01/2009 15:49
Avatar van WijnandModerator
  1. string MainKlantnummer = "";
  2. try {
  3. if (Session["klantnr"] != null) {
  4. MainKlantnummer = Session["klantnr"].ToString();
  5. }
  6. } catch (Exception e) {
  7. MainKlantnummer = "0" + e.Message;
  8. }


De bovenstaande code geeft de fout: Object reference not set to an instance of an object.

Wat er gebeurd is dat hij 2 keer de functie waar dit in staat aanroept en dus 2 keer de sessie probeert te zetten. De eerste keer lukt (krijg hem ook terug). De tweede keer heeft hij opeens een object van die sessie gemaakt. Iemand enig idee?

22 antwoorden

Gesponsorde links
Offline tomie94 - 27/01/2009 15:52 (laatste wijziging 27/01/2009 15:53)
Avatar van tomie94 PHP interesse is dit je hele code, plaats hem anders even op plaatscode en probeer anders een String MainKlantnummer ipv MainKlantnummer.

edit: oeps ik zag de eerste regel niet, sorry:P
Offline Abbas - 27/01/2009 15:56
Avatar van Abbas Gouden medaille

Crew .NET
tomie94 schreef:
en probeer anders een String MainKlantnummer ipv MainKlantnummer.
What? String moet niet met een hoofdletter. Als je het met een hoofdletter gebruikt is dat de .NET-class "String", zonder hoofdletter het variabele-type.

Maar inderdaad misschien iets meer code zou handig zijn, dit is een beetje vaag. 
Offline Wijnand - 27/01/2009 15:58
Avatar van Wijnand Moderator Ik kan niet heel veel plaatsen, maar wat wil je weten?

(al deze functie één keer aangeroepen wordt dan werkt het goed, als hij 2 keer aangeroepen wordt gaat het fout).

Het is zo'n functie:
  1. public string geefnummer() {
  2. string MainKlantnummer = "";
  3. try {
  4. if (Session["klantnr"] != null) {
  5. MainKlantnummer = Session["klantnr"].ToString();
  6. }
  7. } catch (Exception e) {
  8. MainKlantnummer = "0" + e.Message;
  9. }
  10. return MainKlantnummer;
  11. }
Offline Abbas - 27/01/2009 16:03
Avatar van Abbas Gouden medaille

Crew .NET
Ok, maar misschien zit de fout niet in de functie maar in het stuk code waar de functie aangeroepen wordt. Zit er daar niet iets wat de functie kan doen misgaan?

En probeer eens het volgende, niet dat dat het probleem gaat verhelpen denk ik, maar een sessie mag niet alleen niet NULL zijn, maar ook niet een lege waarde hebben.

  1. if(String.IsNullOrEmpty(Session["klantnr"]))
  2. //...
Offline Wijnand - 27/01/2009 16:12
Avatar van Wijnand Moderator Nou, het probleem is dus dat de sessie ergens onderweg gewijzigd wordt volgens mij, maar dit gebeurd niet door mij (volgens mij ;))


Zo roep ik 'm aan in een script:
  1. AppController main = new AppController();
  2. main.geefnummer();


Dus dat zou niet het probleem mogen zijn toch?
Offline Abbas - 27/01/2009 16:57
Avatar van Abbas Gouden medaille

Crew .NET
Waarom instantieer je opnieuw je AppController? Komt de gegeven code ook uit een Controller of van een aparte klasse? Want als het van een Controller komt doe je gewoon:

  1. public class JouwController : AppController
  2. {
  3. //...
  4. }

En anders eens een BreakPoint plaatsen bij die regel en stap per stap volgen wat er gebeurt. 
Offline Wijnand - 27/01/2009 17:01
Avatar van Wijnand Moderator nou het zit zo.

De controller roept een aparte class aan. Deze class heeft appcontroller niet ge-extend.


En hoe bedoel je breakpoint doen bij elke regel? een response.write + response.end() bij elke regel net zolang totdat het fout gaat?
Offline Abbas - 27/01/2009 17:04
Avatar van Abbas Gouden medaille

Crew .NET
1.
Kan je dan niet extenden?

2.
Je gaat in VS naar de regel waar je die AppController opnieuw instantieert en links van de regelnummers zie je een lichtgrijze kolom. Als je hier op klikt zie je een rood bolletje verschijnen. Wanneer die regel aangesproken wordt kan je zien wat er gebeurt. Gebruik de F11-knop om dan stap per stap verder te gaan.
Offline Wijnand - 27/01/2009 17:07
Avatar van Wijnand Moderator 1. Dat heeft toch geen zin. Want die class wordt toch zelf ook aangeroepen door de controller? Of je bedoeld die class extenden in je controller? dat kan wel. Dat ga ik morgen vroeg proberen!

2. Ik ga dat ook proberen als het niet werkt.

bedankt!
Offline Abbas - 27/01/2009 17:18
Avatar van Abbas Gouden medaille

Crew .NET
1. Dat bedoelde ik! :D
Offline nemesiskoen - 27/01/2009 20:56
Avatar van nemesiskoen Gouden medaille

PHP expert
Citaat:
Of je bedoeld die class extenden in je controller? dat kan wel. Dat ga ik morgen vroeg proberen!

Dat snap ik niet wat je daarmee bedoeld. Kan je een iets duidelijker voorbeeld geven waarvoor je dit zou willen gebruiken, want dit lijkt me eerder een fout in ontwerp dan in programmeren.
Offline Wijnand - 28/01/2009 09:20
Avatar van Wijnand Moderator Ik heb een class gemaakt met alle methods erin die webservices aanroepen (webservices.cs). In mijn controller roep ik die aan om een bepaalde actie te doen. Dus in mijn index-method roep ik een functie aan om een lijst te halen uit een webservice. snap je?
Offline nemesiskoen - 28/01/2009 12:16
Avatar van nemesiskoen Gouden medaille

PHP expert
En wat lukt er niet?
Offline Wijnand - 28/01/2009 12:20
Avatar van Wijnand Moderator Het probleem is (denk ik) dat ik in mijn controller een functie aanroep om een nummer te krijgen en dat ik in webservices.cs diezelfde functie aan roep van appController (zoals in de eerder gegeven voorbeelden).

Dat zou - volgens mij - goed moeten gaan, maar de 2de keer geeft hij geen nummer meer terug (dat nummer haalt hij uit een sessie waar verder niets mee gebeurde, behalve dat hij een nummer afgeeft).
Offline nemesiskoen - 28/01/2009 12:33
Avatar van nemesiskoen Gouden medaille

PHP expert
Dus:

nummer1 = EenController.MethodeDieInAppControllerStaatEnEenNummerTerugStuurt();

nummer2 = appController.MethodeDieInAppControllerStaatEnEenNummerTerugStuurt();

en nummer1 en nummer2 verschillen?
Of zit ik verkeerd?

Kan je die methode die in AppController staat eens laten zien?
Offline Wijnand - 29/01/2009 09:28 (laatste wijziging 29/01/2009 12:28)
Avatar van Wijnand Moderator
Citaat:
Kan je dan niet extenden?


ALs ik dat doet werkt het niet. Het is een statische class en als ik die appController extend en ik doe: this.getNummer() dan pakt hij 'this' niet.

error:
Static class 'TestMVC.Scripts.WebservicesNavision' cannot derive from type 'TestMVC.AppController'. Static classes must derive from object.

edit:
Ik heb heel wat lopen klooien, met ints en strings. Maar het probleem blijft bestaan dat het eerst een waarde heeft in de sessie en daarna niet meer.

deze functie:

  1. public string getNummer() {
  2. string MainNummer = "";
  3. try {
  4. string var = (string)Session["nr"];
  5. if (var != null) {
  6. MainNummer = var;
  7. }
  8. } catch (Exception e) {
  9. MainNummer = "";//e.Message;
  10. }
  11. return MainNummer;
  12. }


Ik heb nu net wat verder getest. Als ik dit doe in mijn controller:
ViewData["nummer"] = this.getNummer();
ViewData["nummer2"] = this.getNummer();

dan krijg ik 2 keer het nummer terug. Het is dus niet het probleem van het nummertje.

Maar als ik dit doe:
ViewData["projecten"] = Webservices.AlleProjectenPerNummer();

waarin dit staat:
  1. public static class Webservices {
  2.  
  3. public static AppController main = new AppController();
  4.  
  5. public static object AlleProjectenPerNummer() {
  6. /*een bepaalde webservice aanroepen (wegens veiligheid zet ik die hier niet neer) met hetvolgende:
  7. Convert.ToString(main.getNummer());
  8.  
  9. nog wat leuke dingen doen om een object te krijgen
  10.  
  11. en als laatste het object terugsturen dat ik krijg:
  12. */
  13. return hetobject;
  14. }
  15. }


dan werkt hij niet.
Heb ik zo genoeg code gegeven?

edit2: ik heb zwaar het gevoel dat je in een static class niet normaal met sessie kan werken en omdat ik die andere class inlaad die wel met een sessie werkt, dat hij hem daarom niet pakt. Help? 

edit3: ik heb het voor de zekerheid omgebouwd naar cookies. Nu werkt het allemaal met cookies dus. Maar nogsteeds werkt het niet binnen de static class. Wat ik erbij gedaan heb in de static class is dit:

public static string geefnummerterug() {
return Convert.ToString(Request.Cookies["nr"]);
}

In deze cookie zit de gegevens. Hij heeft een probleem met Request (The name 'Request' does not exist in the current context). Ik heb daar ook neergezet: main.getNummer(); en dan geeft hij -1 aan (ik heb daar bij catch (Exception) { return "-1"} staan).

Ik heb het idee dat je in een statische class niet kunt werken met cookies en sessies. klopt dit?


Edit 3
Ik heb nu het hele ding nog verder omgebouwd. Ik heb de static class geen static class meer gelaten. Ik heb nu dit als class:

  1. public class WebservicesNavision : AppController {
  2. public string geefnummerterug() {
  3. return Convert.ToString(this.getNummer());
  4. }
  5. }


Ik roep hem zo aan in mijn controller:
  1. public class ProjectenController : AppController {
  2.  
  3. Webservices webser = new Webservices();
  4.  
  5. public ActionResult Index() {
  6. ViewData["klantnr"] = this.getNummer();
  7. ViewData["klantnr2"] = webser.geefnummerterug();
  8. return View();
  9. }
  10. }


Hij doet het nogsteeds niet. Geeft -1 terug.
Offline nemesiskoen - 29/01/2009 13:59
Avatar van nemesiskoen Gouden medaille

PHP expert
Je kan hem wel static maken, als je zegt dat het in een cookie zit kan je het zo doen:

  1. HttpContext.Current.Request.Cookies["nr"]);
Offline Wijnand - 29/01/2009 14:11
Avatar van Wijnand Moderator Ja maar dat werkte niet omdat hij Current niet herkent + dat verhelpt het probleem toch niet?
Offline nemesiskoen - 29/01/2009 14:14
Avatar van nemesiskoen Gouden medaille

PHP expert
Was het probleem niet dat je Request/Response niet kon aanroepen in een static klasse die niets geen view of controller was?
Offline Wijnand - 29/01/2009 14:21
Avatar van Wijnand Moderator nee.. 

Het probleem is dat ik in die class webservice een functie aanroept die naar cookies kijkt.

Die cookies hebben altijd waarde, maar als ik hem benader vanuit de webservice-class dan is hij leeg en geeft een fout (die ik eerder heb neergezet).
Offline nemesiskoen - 29/01/2009 14:25 (laatste wijziging 29/01/2009 14:25)
Avatar van nemesiskoen Gouden medaille

PHP expert
Ik zal over die foutmelding hebben gelezen, kan je even geven wat hij bij die foutmelding geeft? Dus de exception NIET opvangen en gewoon de message even kopiëren en hier plaatsen?
Offline Wijnand - 02/02/2009 12:18
Avatar van Wijnand Moderator Opgelost. Ik heb inplaats van gebruik te maken van een webservices.cs deze method's in de appcontroller gezet, en toen werkte het. Het moet maar even zo... wie weet dat ik er ooit achter kom ;)
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.217s