Avatar billede mikkel251 Seniormester
09. juli 2016 - 16:32 Der er 26 kommentarer og
1 løsning

tilføj flere af samme produkt

Hej eksperter.
jeg er lidt på bar bund her, når jeg har valt det produkt jeg gerne vil købe og har lagt det i kurven, så får jeg denne fejl i local-host når jeg vil tilføje 2 af samme produkt

Serverfejl i programmet '/'.

Objektreferencen er ikke indstillet til en forekomst af et objekt.

Beskrivelse: Der opstod en undtagelse, der ikke blev behandlet, under udførelse af den aktuelle webanmodning. Se staksporingen for at få flere oplysninger om fejlen, og hvor den kom fra i koden.

Detaljer om undtagelse: System.NullReferenceException: Objektreferencen er ikke indstillet til en forekomst af et objekt.

Kildefejl:


Linje 26:        {
Linje 27:            DataRow[] drVareRow;
Linje 28:            drVareRow = dtKurv.Select("fldVareID_dt = " + intVareID);
Linje 29:
Linje 30:            //her tager den antallet af det som ligger i kurven og ligger en til hvis man trykker på tilføj knappen

Kildefil: c:\Users\Mikkel\Dropbox\Hovedforløbet webintegrator\web-shop\rediger-kurv.aspx.cs    Linje: 28

Staksporing:


[NullReferenceException: Objektreferencen er ikke indstillet til en forekomst af et objekt.]
  rediger_kurv.Page_Load(Object sender, EventArgs e) in c:\Users\Mikkel\Dropbox\Hovedforløbet webintegrator\web-shop\rediger-kurv.aspx.cs:28
  System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +51
  System.Web.UI.Control.OnLoad(EventArgs e) +95
  System.Web.UI.Control.LoadRecursive() +59
  System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2952

Versionsoplysninger: Microsoft .NET Framework version:4.0.30319; ASP.NET version:4.6.1073.0

i kan se siden her tryk på tilføj eller fjern.
http://www.mikkel-pohjola.dk/test.aspx?vareID=1&pris=67,5

får jeg dene fejl:
Server Error in '/' Application.

Runtime Error

Description: An application error occurred on the server. The current custom error settings for this application prevent the details of the application error from being viewed remotely (for security reasons). It could, however, be viewed by browsers running on the local server machine.

Details: To enable the details of this specific error message to be viewable on remote machines, please create a <customErrors> tag within a "web.config" configuration file located in the root directory of the current web application. This <customErrors> tag should then have its "mode" attribute set to "Off".


<!-- Web.Config Configuration File -->

<configuration>
    <system.web>
        <customErrors mode="Off"/>
    </system.web>
</configuration>

Notes: The current error page you are seeing can be replaced by a custom error page by modifying the "defaultRedirect" attribute of the application's <customErrors> configuration tag to point to a custom error page URL.


<!-- Web.Config Configuration File -->

<configuration>
    <system.web>
        <customErrors mode="RemoteOnly" defaultRedirect="mycustompage.htm"/>
    </system.web>
</configuration>

nu har jeg rodet med den her hele dagen og jeg kan ikke finde ud af hvad jeg skal gøre :D
Avatar billede softspot Forsker
09. juli 2016 - 18:08 #1
Du skal nok fyre op under din debugger og sætte er breakpoint i linje 28. Så ser du formegentlig hurtigt hvad problemet er.

Mit bud er, at du ikke har en værdi i intVareID, givetvis fordi du ikke har fået den aflæst fra Request.QueryString["vareid"] eller noget andet databinding, der ikke spiller som det skal.
Avatar billede arne_v Ekspert
09. juli 2016 - 21:34 #2
Mit gaet vil vaere at det er dtKurv som er null.
Avatar billede softspot Forsker
09. juli 2016 - 22:14 #3
Det lyder faktisk også mere sandsynligt, nu du nævner det arne :-)
Avatar billede mikkel251 Seniormester
09. juli 2016 - 22:18 #4
Jeg må lige prøve at debugge den for det lyder meget sandsynligt det er dtkurv
Avatar billede mikkel251 Seniormester
10. juli 2016 - 16:19 #5
hmm det kan jeg ikke helt finde rundt i hvordan jeg skal løse, den driller meget..
nu får i lige hele koden

det her er indkøbskurven
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class test : System.Web.UI.Page
{
    vareFac objVare = new vareFac();
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            //Udregning af pris og rabatter
            //hvis querystring ikke er tom så skal der hentes en vare efter id
            DataTable dtKurv = objVare.hentVareUdFraId(Convert.ToInt32(Request.QueryString["vareID"]));

            //Variablen intVareId oprettes og tildeles værdien fra querystringen
            int intVareId = Convert.ToInt32(Request.QueryString["vareID"]);

            //prisen - hentes fra databasen
            decimal _pris = Convert.ToDecimal(dtKurv.Rows[0]["fldPris"]);

            //Rabat - hentes fra databasen
            decimal _rabat = Convert.ToInt32(dtKurv.Rows[0]["fldRabat"]);

            //Den totale rabat - pris * rabat divideret med 100 = rabatten
            decimal _TotalRabat = _pris * _rabat / 100;

            //Ialt pris minus den totale rabat
            decimal _total = _pris - _TotalRabat;

            //hvis rabatten er 0 - altså ingen rabat så skal total være = prisen
            if (Convert.ToInt32(dtKurv.Rows[0]["fldRabat"]) == 0)
            {
                _total = _pris;
            }
           

            //her laver jeg indkøbs kurvens tabel.
            litKurv.Text += "<th>Varenr</th>";
            litKurv.Text += "<th>Vare navn</th>";
            litKurv.Text += "<th>Handling</th>";
            litKurv.Text += "<th>Antal vare</th>";
            litKurv.Text += "<th>Handling</th>";
            litKurv.Text += "<th>Pris</th>";

            foreach (DataRow drKurv in dtKurv.Rows)
            {
                litKurv.Text += "<tr>";
                litKurv.Text += "<td>";
                litKurv.Text += "<p>" + drKurv["fldId"] + "</p>";
                litKurv.Text += "</td>";

                litKurv.Text += "<td>";
                litKurv.Text += "<p>" + drKurv["fldTitel"] + "</p>";
                litKurv.Text += "</td>";
             
                litKurv.Text += "<td>";
                litKurv.Text += "<a  href='rediger-kurv.aspx?Action=plus&vareID=" + drKurv["fldId"] +"'>Tilføj</a>";
                litKurv.Text += "</td>";


                litKurv.Text += "<td>";
                litKurv.Text += "her skal der stå det antal vare man har købt" + drKurv["fldAntal"];
                litKurv.Text += "</td>";


                litKurv.Text += "<td>";
                litKurv.Text += "<a  href='rediger-kurv.aspx?Action=minus&vareID=" + drKurv["fldId"] + "'>Fjern</a>";
                litKurv.Text += "</td>";

                litKurv.Text += "<td>";
                litKurv.Text += "<p>" + String.Format("{0:#.00}", _total) + " kr.</p>";
                litKurv.Text += "</td>";
                litKurv.Text += "</tr>";
            }
            litKurv.Text += "";
        }
    }
}


den her er når jeg trykker på tilføj eller fjern i indkøbskurven for at tilføje et mere produkt af samme slags.
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class EditKurv : System.Web.UI.Page
{
    //Datatabellen dtKurv erklæres som en ny DataTabel
    private DataTable dtKurv = new DataTable();

    protected void Page_Load(object sender, EventArgs e)
    {
        //Querystrengen "Action" bruges til holde styr på, om der skal lægges 1 til det eksisterende antal eller der skal trækkes 1 fra. Kommer tallet ned på 0, så skal varen fjernes
        //Der oprettes en strengvariabel strAction, som skal indeholde værdien af querystrengen Action
        string strAction = Request.QueryString["Action"].ToString();

        //Der oprettes en variabel af typen integer, som skal indeholde varens id
        int intVareID = Int32.Parse(Request.QueryString["vareID"]);
        dtKurv = (DataTable)Session["Kurv"];

        //Hvis querystrengen Actions værdi er plus, så finder man det tilhørende vareID og lægger 1 til det eksisterende antal
        if (strAction == "plus")
        {
            DataRow[] drVareRow;
            drVareRow = dtKurv.Select("fldVareID_dt = " + intVareID);

            //her tager den antallet af det som ligger i kurven og ligger en til hvis man trykker på tilføj knappen
            drVareRow[0]["fldAntal_dt"] = Int32.Parse(drVareRow[0]["fldAntal_dt"].ToString()) + 1;
        }

        //Hvis querystrengen Actions værdi er minus, så finder man det tilhørende vareID og trækker 1 fra det eksisterende antal
        if (strAction == "minus")
        {
            DataRow[] drVareRow2;
            drVareRow2 = dtKurv.Select("fldVareID_dt = " + intVareID);

            //Kommer antallet ned på 0, dvs. det er 1, når man starter, så slettes den pågældende vare
            if (Int32.Parse(drVareRow2[0]["fldAntal_dt"].ToString()) == 1)
            {
                drVareRow2[0].Delete();
            }
            else
            {
                //hvis man trykker på fjern så slettes det ene af det indhold som er i kurven.....
                drVareRow2[0]["fldAntal_dt"] = Int32.Parse(drVareRow2[0]["fldAntal_dt"].ToString()) - 1;
            }
        }
        //Session["Kurv"] fyldes med datatabellen dtKurv
        Session["Kurv"] = dtKurv;

        //Og man sendes tilbage til siden kurv.aspx
        Response.Redirect("Kurv.aspx");
    }
}

Jeg forstå ikke helt hvad det er min lære gør i det her linjer jeg har som er her og om der ikke er en smartere måde at gøre det på som måske er nemmere??
  //HVAD ER DET SOM SKER HER
        int intVareID = Int32.Parse(Request.QueryString["vareID"]);
        dtKurv = (DataTable)Session["Kurv"];

        //HVAD ER DET SOM SKER HER
        if (strAction == "plus")
        {
            //HVAD ER DET SOM SKER HER
            DataRow[] drVareRow;
            drVareRow = dtKurv.Select("fldVareID_dt = " + intVareID);

            //HVAD ER DET SOM SKER HER
            drVareRow[0]["fldAntal_dt"] = Int32.Parse(drVareRow[0]["fldAntal_dt"].ToString()) + 1;
        }

        //HVAD ER DET SOM SKER HER
        if (strAction == "minus")
        {
            //HVAD ER DET SOM SKER HER
            DataRow[] drVareRow2;

            //HVAD ER DET SOM SKER HER
            drVareRow2 = dtKurv.Select("fldVareID_dt = " + intVareID);

            //Kommer antallet ned på 0, dvs. det er 1, når man starter, så slettes den pågældende vare
            if (Int32.Parse(drVareRow2[0]["fldAntal_dt"].ToString()) == 1)
            {
                //HVAD ER DET SOM SKER HER
                drVareRow2[0].Delete();
            }
            else
            {
                //HVAD ER DET SOM SKER HER
                drVareRow2[0]["fldAntal_dt"] = Int32.Parse(drVareRow2[0]["fldAntal_dt"].ToString()) - 1;
            }

I skal have tak for at hjælpe mig med min umulige opgave :D :D
Avatar billede arne_v Ekspert
10. juli 2016 - 16:34 #6
Fejlen tyder paa at:

dtKurv = (DataTable)Session["Kurv"];

saetter dtKurv til null.
Avatar billede arne_v Ekspert
10. juli 2016 - 16:34 #7
Saa maaske:

dtKurv = (DataTable)Session["Kurv"];
if(dtKurv == null)
{
    dtKurv = new DataTable();
}
Avatar billede arne_v Ekspert
10. juli 2016 - 16:37 #8
Med hensyn til den kode som du ikk eforstaar saa er det ikke god kode.

Navne er prefixed med noget som angiver type.

MS siger klart:

    DO NOT use Hungarian notation.

https://msdn.microsoft.com/en-us/library/ms229045(v=vs.110).aspx
Avatar billede arne_v Ekspert
10. juli 2016 - 16:39 #9
int intVareID = Int32.Parse(Request.QueryString["vareID"]);

henter vareID fra URL

dtKurv = (DataTable)Session["Kurv"];

henter kurv fra session

if (strAction == "plus")

tester paa hvad action er (og action er ogsaa hentet fra URL tidligere)
Avatar billede arne_v Ekspert
10. juli 2016 - 16:43 #10
DataRow[] drVareRow;
drVareRow = dtKurv.Select("fldVareID_dt = " + intVareID);

burde skrives som:

DataRow[] drVareRow = dtKurv.Select("fldVareID_dt = " + intVareID);

og henter alle raekker fra kurv som har den paagaeldende vareID.

drVareRow[0]["fldAntal_dt"] = Int32.Parse(drVareRow[0]["fldAntal_dt"].ToString()) + 1;

taeller antal af den paagaeldende vare op med 1 i den foerste (og formentligt eneste raekke).

Jeg tror ieoverigt at det boer laves som:

drVareRow[0]["fldAntal_dt"] = (int)drVareRow[0]["fldAntal_dt"] + 1;
Avatar billede arne_v Ekspert
10. juli 2016 - 16:45 #11
if (Int32.Parse(drVareRow2[0]["fldAntal_dt"].ToString()) == 1)
            {
                drVareRow2[0].Delete();
            }
            else
            {
                drVareRow2[0]["fldAntal_dt"] = Int32.Parse(drVareRow2[0]["fldAntal_dt"].ToString()) - 1;
            }

har logikken:

hvis antal == 1 saa
  slet raekke aka linie i kurv
ellers
  tael antal ned med 1

Og jeg mener igen at den burde laves som:

if ((int)drVareRow2[0]["fldAntal_dt"] == 1)
            {
                drVareRow2[0].Delete();
            }
            else
            {
                drVareRow2[0]["fldAntal_dt"] = (int)drVareRow2[0]["fldAntal_dt"] - 1;
            }
Avatar billede mikkel251 Seniormester
10. juli 2016 - 17:53 #12
det kan jeg godt se med navngivningen, jeg prøver lige om jeg kan få det til at give mening når jeg skriver det om ala det du har skrevet,
men når hun laver

DataRow[] drVareRow = dtKurv.Select("fldVareID_dt = " + intVareID);

er det så en table med indhold fra fldvareID_dt ??
fordi der er ingen tabeller i databasen der hedder fldvareID_dt, så er det en table hun opretter i codebehind som så ses på siden og hvordan er logikken i den..

i må undskylde jeg spørger så meget men jeg prøver at se logikken i den og min erfaring i kodning er kun 1 år og 6 mdr hvor jeg både har haft html og css til at starte med og i det sidste år har jeg knoklet med ASP.NET webforms, men øvelse gør mester så derfor spørger jeg hel masse :D jeg håber det er oki :D
Avatar billede arne_v Ekspert
10. juli 2016 - 18:14 #13
dtKurv er en DataTable - en DataTable et er antal kolonner og et antal raekker

.Select(kriterie) udvaelger en delmaengde af raekkerne, men beholder alle kolonnerne

den kunne have returneret en ny DataTable men returnerer altsaa et array af DataRow.

fldvareID_dt er en kolonne
Avatar billede arne_v Ekspert
10. juli 2016 - 18:19 #14
Og ingen grund til at undskylde for at spoerge. Det er formaalet med eksperten.dk !
Avatar billede mikkel251 Seniormester
11. juli 2016 - 11:50 #15
det ved jeg ikke hvorfor jeg ikke havde set noget før, du har ret det er jo et array hun laver i den her
DataRow[] drVareRow = dtKurv.Select("fldVareID_dt = " + intVareID);
hvor den vælger alt det indhold der er i fldVareID_dt og i qerystringen intVareID og viser den i en tabel, er det ikke meget rigtig forstået??
Avatar billede mikkel251 Seniormester
11. juli 2016 - 13:33 #16
Det som min lære laver her, kunne det ikke ligeså godt være en tabel i databasen med det indhold??

eller er det bedre at lave indholdet af indkøbskurven sådan her:??

her er koden
dtKurv = (DataTable)Session["kurv"];

        if (dtKurv == null)
        {
            dtKurv = new DataTable();
            dtKurv.TableName = "tblKurv";

            dtKurv.Columns.Add("fldID", typeof(int));
            dtKurv.Columns.Add("fldVareID_dt", typeof(int));
            dtKurv.Columns.Add("fldAntal_dt", typeof(int));
            dtKurv.Columns.Add("fldPris_dt", typeof(float));         
            dtKurv.Columns["fldID"].AutoIncrement = true;
            Session["Kurv"] = dtKurv;
        }
Avatar billede arne_v Ekspert
11. juli 2016 - 15:04 #17
Kurve er ofte kun i memory ikke i databasen, men vil man gemme kurv, saa kan en DataTable jo nemt gemmes i database.
Avatar billede mikkel251 Seniormester
11. juli 2016 - 16:13 #18
Det giver mening når du siger "Kurve er ofte kun i memory ikke i databasen"  fordi så kan jeg bedre forstå den kode hun har skrevet, den skal jeg lige sidde og prøve mig frem med :D
Avatar billede arne_v Ekspert
11. juli 2016 - 16:34 #19
Husk at der er ogsaa en virkelighed bag programmet.

En kunde gaar ind paa web shop, vaelger nogle varer men fortryder og koeber ikke.

X dage senere gaar han ind paa samme web shop. Forventer han nu at starte med en tom kurv eller forventer han at starte med den kurv han lavede X dage tidligere?

Mit gaet er at 75+% vil foretraekke at starte med en tom kurv.
Avatar billede mikkel251 Seniormester
11. juli 2016 - 17:00 #20
Der har jeg lavet en Session.Timeout = 180; så har han 3 timer og derefter vil kurven blive tømt.

jeg har tænkt at hvis man vil gemme en kurv i flere dage kunne man lave en slags ønske liste hvor man kan lave en cookie med en levetid på en uge eller mere som vil huske det han har gemt og der skal så være mulighed for selv at tømme den liste :D

jeg er bare ikke nået helt dertil endnu :D
selve indkøbskurven forvirrede mig en del og den skulle jeg have på plads først :D men tanken var at lave den anden også :D
Avatar billede arne_v Ekspert
13. juli 2016 - 02:24 #21
Hvis du gemmer i cookie, saa er det afhaengig af hvilken computer der bruges. Hvis der gemmes i database afhaenger det ikke af computer.
Avatar billede mikkel251 Seniormester
13. juli 2016 - 15:21 #22
Det kan man godt gøre?

ved du hvad en - generisk liste - betyder?
Avatar billede arne_v Ekspert
13. juli 2016 - 15:50 #23
En generisk liste maa vaere en LIst<T>.

Altsaa:

List<int> intlist = new List<int>();
List<string> intlist = new List<string>();
List<Foobar> intlist = new List<Foobar>();
Avatar billede mikkel251 Seniormester
14. juli 2016 - 10:10 #24
oki den tror jeg godt jeg forstå, det kan F.eks være liste over de ting man har købt osv..
Avatar billede arne_v Ekspert
16. juli 2016 - 05:04 #25
Ja. Eller man kunne have en List<OrdreLinie> som kurv.

:-)
Avatar billede mikkel251 Seniormester
16. juli 2016 - 13:11 #26
den skal jeg nok side og finde lidt ud af før jeg helt ved hvad jeg vil med den :D
Avatar billede Slettet bruger
30. juli 2016 - 07:53 #27
Spam

Dette indlæg er blevet modereret af en CoAdmin

Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester