Avatar billede Counx Nybegynder
14. maj 2012 - 12:22 Der er 9 kommentarer og
1 løsning

ASP.NET - Ajax Rating System Codebehind

Jeg har et problem med et rating system baseret på Ajax.
På min aspx ligger min rating i en repeater:

<asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource1">
                    <HeaderTemplate>
                        <h1>Bedst Bedømte</h1>
                        <hr />
                    </HeaderTemplate>
                    <SeparatorTemplate>
                        <br />
                        <hr />
                        <br />
                    </SeparatorTemplate>
                    <ItemTemplate>
                            <asp:Label ID="ProduktNavnLabel" runat="server"
                                Text='<%# Eval("ProduktNavn") %>' />
                            <br />
                        <asp:Image ImageUrl='<%# Eval("ImageURL") %>' runat="server" />
                            <br />
                            ProduktPris:
                            <asp:Label ID="ProduktPrisLabel" runat="server"
                                Text='<%# Eval("ProduktPris") %>' />
                            <br />
                            ProduktRating:
                        <asp:Rating ID="ratingControl" runat="server" OnChanged="RatingControlChanged" FilledStarCssClass="FilledStar" EmptyStarCssClass="EmptyStar" AutoPostBack="True" ReadOnly="False" StarCssClass="Star" WaitingStarCssClass="FilledStar" CurrentRating="2">
                        </asp:Rating>
                        <b> <asp:label ID="lbltxt" runat="server"/> </b>

                            <br />
                    </ItemTemplate>
                    </asp:Repeater>
               
                    <asp:SqlDataSource ID="SqlDataSource1" runat="server"
                        ConnectionString="<%$ ConnectionStrings:CharcuteriConnectionString %>"
                        SelectCommand="SELECT TOP (3) ProduktID, ProduktNavn, ImageURL, ProduktPris, Rate FROM Produkter ORDER BY Rate DESC">
                    </asp:SqlDataSource>


Hele min CodeBehind ser ud som følgende:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using AjaxControlToolkit;


public partial class MasterPage : System.Web.UI.MasterPage
{
   
    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["CharcuteriConnectionString"].ConnectionString);
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            BindRatingControl();
        }
       
    }
    protected void RatingControlChanged(object sender, AjaxControlToolkit.RatingEventArgs e)
    {
        Rating ratingControl = (Rating)Repeater1.FindControl("ratingControl");
        con.Open();
        SqlCommand cmd = new SqlCommand("insert into Produkter(Rate)values(@Rating)", con);
        cmd.Parameters.AddWithValue("@Rating", ratingControl.CurrentRating);
        cmd.ExecuteNonQuery();
        con.Close();
        BindRatingControl();
    }
    protected void BindRatingControl()
    {
        Rating ratingControl = (Rating)Repeater1.FindControl("ratingControl");
        Label lbltxt = (Label)Repeater1.FindControl("lbltxt");
        int total = 0;
        int average = 0;

        DataTable dt = new DataTable();
        con.Open();
        SqlCommand cmd = new SqlCommand("Select Rate from Produkter", con);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.Fill(dt);
        if (dt.Rows.Count > 0)
        {
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                total += Convert.ToInt32(dt.Rows[i][0].ToString());
            }
            average = total / (dt.Rows.Count);
            if (average > 1)
            {
                ratingControl.CurrentRating = average;
                lbltxt.Text = dt.Rows.Count + "user(s) have rated this article";
            }
            else
            {

            }
           
        }
    }
}

Og i min MSSQL Databasen ser min Tabel sådanne ud:

ProduktID - int - Unchecked
ProduktNavn - nvarchar(100) - Unchecked
ProductBeskrivelse - nvarchar(MAX) -    Unchecked
ImageURL - nvarchar(MAX) - Unchecked
ProduktPris - money - Unchecked
ProduktVægt - decimal(5, 3) - Unchecked
ProduktDato - date - Unchecked
Rate - int - Checked

Fejlen på siden er noget i min "ratingControl.CurrentRating = average;" linje som ligger næsten til sidst på codebehind siden.
Er der en som kan hjælpe mig, har prøvet alt nu?
Avatar billede Syska Mester
14. maj 2012 - 12:35 #1
Hvad er fejlen?

Hvad er "Har prøvet alt" :-) ?
Avatar billede jokkejensen Novice
14. maj 2012 - 12:37 #2
og hvori ligger dit "ajax" ? udover du henter AjaxControlToolkit ?
Avatar billede Counx Nybegynder
14. maj 2012 - 12:54 #3
Der kommer lige en fejlmeldelse her. :)
Object reference not set to an instance of an object.

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 reference not set to an instance of an object.


Forstår ikk helt hvad du mener med hvor mit Ajax ligger, den generer jo automatisk en "Bin" mappe hvis du trækker en Ajax kotrol ind på siden. :)

Det jeg har kunnet komme frem til er at jeg måske skal konvetere "average" om til en string i stedet for at det et en int, men ved ikk helt hvordan jeg skal gribe det an, da jeg skal konvetere den, men det laver et bug og "average" er stadig en int efter jeg har prøvet at koventere. :)
Avatar billede Syska Mester
14. maj 2012 - 13:09 #4
System.NullReferenceException: Object reference not set to an instance of an object.

Ergo, du har et object som er Null ...

Så mangler vi bar en linje for at komme tættere på ...
Avatar billede Counx Nybegynder
14. maj 2012 - 13:17 #5
Hvis jeg prøver at gå igennem den step by step i debug-mode, så failer den på linjen:

if (average > 1)
            {
                ratingControl.CurrentRating = average;  <-------
                lbltxt.Text = dt.Rows.Count + "user(s) have rated this article";
            }


ratingControl.CurretnRating er null og average er 3 (fordi count var 5 og total var 15)

Men den skal jo bruge average som CurrentRating

BTW tak for hurtige svar :)
Avatar billede Syska Mester
14. maj 2012 - 13:26 #6
Det er sikkert din "Rating" som er null ...

Sikkert på den finder den i din:
Rating ratingControl = (Rating)Repeater1.FindControl("ratingControl");
Avatar billede Syska Mester
14. maj 2012 - 13:26 #7
Siden CurrentRating sikkert er en valuetype type kan den ikke være NULL, med mindre den er blevet lavet nullable med Null<T>, hvilket jeg tvivler på.
Avatar billede Counx Nybegynder
14. maj 2012 - 13:33 #8
Som du kan se er "CurrentRating" i Rating Kontrolen sat til standart at være 2.

Jeg tvivler også på at min FindControl virker, men ved ikke hvordan jeg så skulle få fundet den på min codebehind. :S
Avatar billede Syska Mester
14. maj 2012 - 13:37 #9
Jeg tvivler på du kan bind det hele sådan.

Binding i din Repeater sker først efter Load ...

Jeg mener der er en event på Repeateren der hedder noget ala: ItemBound ... der kan du nok finde din control.

mvh
Avatar billede Counx Nybegynder
11. august 2014 - 12:51 #10
Lukkende svar på gammelt spørgsmål.
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



IT-JOB