Avatar billede dennism Nybegynder
12. maj 2009 - 18:07 Der er 13 kommentarer og
1 løsning

ASP.NET: Kode i aspx-fil

Jeg har en aspx fil med noget C# kode:

            <%
                double sensorValue = this.GetSensorValue((int)DataBinder.Eval(Container.DataItem, "Id"));
                Response.Write(sensorValue);
            %>

Jeg har problemer med min DataBinder - den kan ikke finde Container. Hvis jeg i stedet for <% bruger <%# virker dette fint, men så kan jeg ikke gemme den værdi jeg henter ud i en lokal variabel.

Hvad er løsningen på dette? Jeg er nødt til at kunne gemme værdien i sensorValue, da jeg skal bruge den senere.

På forhånd tak for svaret.
Avatar billede Cars10 Praktikant
13. maj 2009 - 11:55 #1
Hvorfor er det lige du ikke vil gøre bruge af din .cs fil
og så smide en Label i din aspx fil?
Avatar billede mjdigital Nybegynder
13. maj 2009 - 12:03 #2
dennism du skal altid kode i .cs filen! :) Rigtig dårlig vane at bruge aspx filen til c# kode.. Gør at den er meget usikker og ikke kan optimeres på samme måde.
Avatar billede Cars10 Praktikant
13. maj 2009 - 12:09 #3
hvis det er fordi du ikke vil hente værdien ud fra det objekt på aspx siden, skal du tilknytte source i .cs filen og hente din værdi derfra
Avatar billede dennism Nybegynder
13. maj 2009 - 13:14 #4
Tak for jeres svar.
Måske jeg lige skulle poste noget af min kode, for at synliggøre hvilken situation jeg er i.

http://dennismadsen.net/uploads/Default.aspx.txt
http://dennismadsen.net/uploads/Default.aspx.cs.txt

Der er problem på linie 46 i Default.aspx:
    <%# this.SetSensorValue(this.GetSensorValueFromService((int)DataBinder.Eval(Container.DataItem, "Id")))%>

Den melder fejlen "cannot convert type 'void' to 'object'", hvilket åbenbart er fordi at <%# gerne vil printe noget.

Hvordan kan jeg komme uden om dette?
Avatar billede Cars10 Praktikant
13. maj 2009 - 13:52 #5
protected void Page_Load(object sender, EventArgs e)
    {
        RepeaterTanks.DataSource = GetTanks();
        RepeaterTanks.DataBind();
    }

    private DataTable GetTanks()
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("Id", typeof(int));
        dt.Columns.Add("Name", typeof(string));
        dt.Columns.Add("Sensors", typeof(DataTable));

        //Hent db service her
        var qTanks = from r in service.Tanks select r;

        foreach (var tank in qTanks)
        {
            DataRow dr = dt.NewRow();
            dr["Id"] = tank.ID;
            dr["Name"] = tank.Name;
            dr["Sensors"] = GetSensors(tank.ID);

            dt.Rows.Add(dr);
        }

        return dt;
    }

    private DataTable GetSensors(int tankID)
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("Id", typeof(int));
        dt.Columns.Add("Name", typeof(string));
        dt.Columns.Add("WarningValue", typeof(string));
        dt.Columns.Add("cssClass ", typeof(string));

        //Hent db service her
        var qSensors = from r in service.Sensors where r.TankID == tankID select r;

        foreach (var sensor in qSensors)
        {
            DataRow dr = dt.NewRow();
            dr["Id"] = sensor.ID;
            dr["Name"] = sensor.Name;
            dr["WarningValue"] = sensor.WarningValue;

            dr["cssClass"] = "valueIconGreen";
            if (sensor.Value < sensor.WarningValue)
                dr["cssClass"] = "valueIconRed";
            if (sensor.Value - 5 < sensor.WarningValue)
                dr["cssClass"] = "valueIconYellow";

            dt.Rows.Add(dr);
        }

        return dt;
    }
Avatar billede Cars10 Praktikant
13. maj 2009 - 13:55 #6
Du kan sikkert også lave det med linq tables. Men jeg er først lige startet på linq, men håber du forstår meningen.

Ligeledes har jeg flyttet din kode fra aspx filen til cs filen, så kan du også debugge din kode rigtig.
Avatar billede Cars10 Praktikant
13. maj 2009 - 14:02 #7
Kan være du også kan lave det hele i linq a la;

        var q = from tank in service.Tanks
                select new
                {
                  Id = tank.Id,
                  Name = tank.Name,
                  Sensors = select new
                  {
                      Name = tank.Sensors.Name
                  }
                };

og så noget if else via:
boolStatement ? ifStatementIsTrue : ifStatementIsFalse
Avatar billede jokkejensen Novice
13. maj 2009 - 14:33 #8
<%# %> til webcontroller, <%= %> uden for.

Dog kræver <%# %> at kontrollen/siden databindes.

/J
Avatar billede Cars10 Praktikant
13. maj 2009 - 14:43 #9
Du mener <% %> uden for

<%= %> svare til <%Response.Write( );%> hvilket han selvfølgelige også kan bruge
Avatar billede dennism Nybegynder
13. maj 2009 - 15:09 #10
Dit forslag med min virker ikke med den select inden i en select. Kan ikke hente tank.Sensors.Name inden i den, da Sensors indeholder mange Sensor.
Avatar billede dennism Nybegynder
13. maj 2009 - 15:09 #11
Rettelse:
Dit forslag med LINQ virker ikke med den select inden i en select. Kan ikke hente tank.Sensors.Name inden i den, da Sensors indeholder mange Sensor.
Avatar billede Cars10 Praktikant
13. maj 2009 - 15:34 #12
Ja det var sådan set også meningen, men jeg ved ikke hvordan det skal laves i linq.
Avatar billede dennism Nybegynder
13. maj 2009 - 15:42 #13
Jeg har lavet om, så jeg nu har dette LINQ:

    RepeaterTanks.DataSource = from tank in service.GetTanks()
                              select new {
                                  Id = tank.Id,
                                  Name = tank.Name,
                                  Sensors = (from sensor in tank.Sensors
                                            where sensor.TankId == tank.Id
                                              let NewestValue = this.GetSensorValueFromService(sensor.Id)
                                            select new {
                                                TypeName = sensor.SensorType.Name,
                                                Value = NewestValue,
                                                WarningValue = sensor.WarningValue,
                                                CssClass = this.GetSensorValueCssClass((double)NewestValue,(double)sensor.WarningValue)
                                            })
                              };

Og følgende i aspx:
        <asp:Repeater ID="RepeaterSensors" runat="server" DataSource='<%# DataBinder.Eval(Container.DataItem, "Sensors")%>'>
            <ItemTemplate>
                <tr>
                    <td>
                    </td>
                    <td>
                        <%# DataBinder.Eval(Container.DataItem, "TypeName")%>
                    </td>
                    <td><%# DataBinder.Eval(Container.DataItem, "Value")%> / <%# DataBinder.Eval(Container.DataItem, "WarningValue")%></td>
                    <td><div class="<%# DataBinder.Eval(Container.DataItem, "CssClass")%>"></div></td>
                </tr>
            </ItemTemplate>
        </asp:Repeater>

Det virker :) Mange tak for hjælpen. Kan godt se, at koden så bliver langt pænere! Vil du smide et svar cars10?
Avatar billede Cars10 Praktikant
13. maj 2009 - 16:12 #14
Ja det var meget bedre. Så fik jeg også lært noget nyt Linq. Den eneste ulempe jeg kan se er at det er sværere at debugge Linq, til gengæld er det hurtigere end det kode jeg postede.
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
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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