2016-07-27 12 views
-1

Ich möchte Up/down-Abstimmungssystem für mehrere Artikel aus der Datenbank abgerufen werden, aber ich möchte Cookie für jeden Artikel hinzufügen, um die Anzahl der Stimmen zu begrenzen, so Cookie an einem Tag abläuft, aber Ich weiß nicht, wo ich den passenden Code hinzufügen soll.Verwendung von Cookies in up/down Abstimmungssystem

weitere Details: jedes Mal wenn Benutzer klicken Sie auf den Pfeil nach oben und umgekehrt verringern

<script> 
    function vote(id, value) { // function vote with 2 arguments: article ID and value (+1 or -1) depending if you clicked on the arrow up or down 
     var dataFields = { 'id': id, 'value': value }; // We pass the 2 arguments 
     $.ajax({ // Ajax 
      type: "POST", 
      dataType: "text",//This for indicate that you'r expecting a text response from server 
      url: "WebService.asmx/updateVotes", 
      data: dataFields, 
      timeout: 3000, 

      success: function (dataBack) { 
       if(
        $('#number' + id).html(dataBack);// div "number" with the new number 
        $('#arrow_up' + id).html('<div class="arrow_up_voted"></div>'); // We replace the clickable "arrow up" by the not clickable one 
        $('#arrow_down' + id).html('<div class="arrow_down_voted"></div>'); // We replace the clickable "arrow down" by the not clickable one 
        $('#message' + id).html('<div id="alertFadeOut' + id + '" style="color: green">Thank you for voting</div>'); // Diplay message with a fadeout 
        $('#alertFadeOut' + id).fadeOut(1100, function() { 
         $('#alertFadeOut' + id).text(''); 
        }); 
       }, 


      error: function() { 
       $('#number' + id).text('Problem!'); 
      } 
     }); 
    } 


</script> 

der obige Code ist ein Skript Aufruf Ajax-Methode Zahl der Stimmen pro zu erhöhen.

public string updateVotes(string id,int value) 
{ 

    System.Threading.Thread.Sleep(500); // delay for 2.5 seconds Network latency 

    post p = db.posts.Find(int.Parse(id)); 
    // assign new values 
    p.totalVotes += value; 
    db.Entry(p).State = System.Data.EntityState.Modified; 
    db.SaveChanges(); 

    string dataBack =p.totalVotes.ToString(); 
    return dataBack; 
} 

Dies ist die Webmethode.

Jetzt habe ich versucht, laut zu denken, und ich code die folgende Funktion zu ewxamine, wenn der Cookie null ist oder nicht.

public bool enableVoting() 
{ 

    HttpCookie cookie = Request.Cookies["enableVote"]; 

    if (Request.Cookies["enableVote"] != null) 
    { 
     return true; 

    } 

    else 
    { 

     return false; 
    } 


} 

ich weiß, es ist falsch, aber zumindest habe ich es versucht.

auch wo eine für jede Schleife hinzuzufügen, um ein Cookie hinzuzufügen, wenn Benutzer für Artikel abstimmen.?

foreach(post p in db.posts){ 
     HttpCookie cookie = new HttpCookie("enableVote"+p.ID); 
     cookie.Value = "article:"+p.ID; 
     cookie.Expires = DateTime.Now.AddDays(1); 
     Response.Cookies.Add(cookie); 
    } 

Antwort

0

Ein Vorschlag. Verwenden Sie keine Cookies dafür. Sie sind leicht zu manipulieren. Löschen Sie den Browserverlauf und Sie können erneut abstimmen .. und wieder .. und wieder.

Erstellen Sie stattdessen eine Abstimmungs-Tabelle in Ihrer Datenbank und fügen Sie einen Datensatz mit der IP des Absenders und der ID des Beitrags, für den sie gewählt haben, zusammen mit einem Zeitstempel hinzu.

Auf diese Weise können Sie einfach die Stimmen zählen und wenn jemand abstimmt, überprüfen Sie kurz, wie lange diese IP zuletzt für diesen Artikel (oder einen Artikel) gestimmt hat.

Auch mit einer Stimme Tabelle in Ihrer Datenbank können Sie leicht Bots, die oben oder unten sind, alles zu fangen, und die Anzahl der Stimmen eine einzige IP kann auf jeden Artikel (nicht mehr als 1 oder zwei Stimmen alle paar Minuten vielleicht).

Wenn Sie sich Sorgen machen, dass mehrere Personen hinter der gleichen IP nicht wählen können, können Sie den Browsernamen angeben und nur die eindeutige ip- und Browserversion als Votum zählen. Das ist ziemlich einzigartig. Es kann auch manipuliert werden, aber es ist ein bisschen schwieriger für den normalen Benutzer.

Update: Ich benutze diesen Code, um einen etwas einzigartigen Schlüssel in einem meiner MVC-Projekte zu bekommen. Der Benutzer kann den Browser wechseln und erneut abstimmen, aber es erfordert ein wenig Aufwand und ist mehr als nur mühsam, den Browserverlauf zu löschen.

Ich kombiniere die IP, den Browser und das Land in eine Zeichenfolge und verwende diese als Abstimmungsschlüssel.

public class UserInfo 
{ 
    public String ip { get; private set; } 
    public String browser { get; private set; } 
    public String country { get; private set; } 

    public UserInfo(HttpRequestBase Request) 
    { 
     ip = Request.UserHostAddress; 
     browser = Request.Browser.Platform + " " + Request.Browser.Type + "/" + Request.Browser.Id + " " + Request.Browser.Version; 
     country = ""; 

     if (Request.UserLanguages.Length > 0) 
      country += " - " + Request.UserLanguages.ElementAt(0); 
    } 
} 

Ich verwende dieses System hier: http://filepublicator.com/ zu überprüfen, ob die Benutzer alle zuvor hochgeladenen Dateien haben (versuchen Sie etwas und in der Nähe Browser laden und wieder dort hin geht, wird es in der Liste).

+0

Vielen Dank für den Rat, haben Sie ein Beispiel oder einen Link, um den Weg zu erklären, die IP des Wählers zu bekommen? –

+1

Mit Asp.net C# kann ich das tun? –