Like و DisLike در Asp.Net با استفاده از IP کاربران

چهارشنبه 21 مرداد 1394

در این مقاله می خواهیم نحوه ایجاد دکمه like و همچنین dislike را با استفاده از IP کاربران آموزش دهیم

در مرحله اول باید یه پروژه از ایجاد کنید

در گام بعدی پوشه های App_Code و Bin را به پروژه اضافه می کنیم

فایل web.config را باز کرده و ConnectionString را مانند کد زیر تنظیم می کنیم

<connectionStrings>
    <clear />
    <add name="DataConnectionString" connectionString=
"Data Source=localhost;Initial Catalog=dbLike;Integrated Security=True;
MultipleActiveResultSets=True" providerName="System.Data.SqlClient"/>
</connectionStrings>

بر روی پوشه App_Code راست کلیک کرده و یک کلاس با عنوان DataBaseContext به پروژه اضافه می کنیم.

نکته:ما دراین پروژه از EntityFramework استفاده خواهیم کرد بنابراین لازم است تا dll های مربوطه را به پروژه اصافه نمائید.در فایل ضمیمه وجود دارد

کدهای زیر را به کلاس DataBaseContext اضافه می کنیم:

public DataBaseContext()
        : base("DataConnectionString")
    {

    }
    static DataBaseContext()
    {
        System.Data.Entity.Database.SetInitializer(
            new System.Data.Entity
            .CreateDatabaseIfNotExists<DataBaseContext>());
    }

دقت کنید کلاس باید از DbContext مشتق شده باشد

در گام بعدی باید کلاس article را به پروژه اضافه کنیم (برای ساخت جدول در بانک اطلاعاتی)

کد های زیر را به کلاس article اضافه می کنیم

public class article
{
	public article()
	{
	}
    [System.ComponentModel.DataAnnotations.Required]
    [System.ComponentModel.DataAnnotations.Key]
    [System.ComponentModel.DataAnnotations.Schema.DatabaseGenerated
        (System.ComponentModel.DataAnnotations.Schema
        .DatabaseGeneratedOption.Identity)]
    public int articleID { get; set; }    
    public string Title { get; set; }
    public string Descriptions { get; set; }
    public bool IsActive { get; set; }
}

یک کلاس دیگر برای دکمه like ایجاد کرده و کد های زیر را می نویسیم:

public class like
{
  public like()
  {
        this.ID = Guid.NewGuid();
        this.IpAddress = HttpContext.Current.Request.UserHostAddress;
  }
    [System.ComponentModel.DataAnnotations.Required]
    [System.ComponentModel.DataAnnotations.Key]
    [System.ComponentModel.DataAnnotations.Schema.DatabaseGenerated
        (System.ComponentModel.DataAnnotations.Schema
        .DatabaseGeneratedOption.None)]
    public Guid ID { get; set; }
    [System.ComponentModel.DataAnnotations.Required]
    public int articleID { get; set; }
    public string IpAddress { get; set; }
}

همچنین یک کلاس با عنوان dislike برای دکمه مربوطه ایجاد کرده و کدهای آنرا را می نویسیم:

public class dislike
{
  public dislike()
  {
    this.ID = Guid.NewGuid();
        this.IpAddress = HttpContext.Current.Request.UserHostAddress;
  }
    [System.ComponentModel.DataAnnotations.Required]
    [System.ComponentModel.DataAnnotations.Key]
    [System.ComponentModel.DataAnnotations.Schema.DatabaseGenerated
        (System.ComponentModel.DataAnnotations.Schema
        .DatabaseGeneratedOption.None)]
    public Guid ID { get; set; }
    [System.ComponentModel.DataAnnotations.Required]
    public int articleID { get; set; }
    public string IpAddress { get; set; }
}

برای ایجاد ارتباط این دو کلاس (like , dislike) با جدول مقالات از کدهای زیر در کلاس like استفاده خواهیم کرد

public article articles { get; set; }

این تکه کد به کلاس article که همان جدول ما در دیتابیس خواهد بود اشاره می کنید

همین طور در کلاس dislike هم تکه کد زیر را می نویسیم

public article articles { get; set; }

در کلاس article کد زیر را برای اشاره به کلاسهای like و dislike می نویسیم:

public System.Collections.Generic.IList<like> likes { get; set; }
public System.Collections.Generic.IList<dislike> dislikes { get; set; }

چون این رابطه از نوع یک به چند می باشد بنابراین کلاس article که از نوع یک بوده به کلاس های like و dislike که در سمت چند می باشند اشاره خواهد کرد

حال سراغ کلاس DataBaseContext رفته و کد زیر را بعد از متد های سازنده برای ایجاد جداول می نویسیم:

public System.Data.Entity.DbSet<article> articles { get; set; }
public System.Data.Entity.DbSet<like> likes { get; set; }
public System.Data.Entity.DbSet<dislike> dislikes { get; set; }

کار ما برای ایجاد جداول تمام است

حالا به سراغ کد نویسی برای ثبت مقالات و دکمه like و dislike می رویم:

یک صفحه ایجاد می کنیم با عنوان AddArticle.aspx برای ثبت مقالات و در رویداد Page_Load کد زیر را می نویسیم:

using (DataBaseContext db = new DataBaseContext())
        {
            article obj = null;
            obj = new article();
            obj.Title = "مقالاه شماره یک";
            obj.Descriptions = "توضیحات";
            obj.IsActive = true;
            db.articles.Add(obj);
            obj = new article();
            obj.Title = "مقالاه شماره دو";
            obj.Descriptions = "توضیحات";
            obj.IsActive = true;
            db.articles.Add(obj);
            obj = new article();
            obj.Title = "مقالاه شماره سه";
            obj.Descriptions = "توضیحات";
            obj.IsActive = true;
            db.articles.Add(obj);
            db.SaveChanges();
            string Msg = "مقاله با موفقیت ثبت شد";
            ScriptManager.RegisterStartupScript(Page, typeof(Page),
            "Alert", "<script>alert('" + Msg + "');</script>",false);
        }

یکبار پروژه را اجرا می کنیم تا بانک اطلاعاتی ما ایجاد شود:

جدوال بانک اطلاعاتی مانند شکل زیر ایجاد می شود

صفحه ای برای نمایش مقالات با نام articles ایجاد می کنید و کدهای زیر را در صفحه aspx می نویسیم:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" BackColor="White" BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px" CellPadding="4" DataKeyNames="articleID" DataSourceID="SqlDataSource1" ForeColor="Black" GridLines="Horizontal" Width="100%">
      <Columns>
        <asp:BoundField DataField="articleID" HeaderText="articleID" InsertVisible="False" ReadOnly="True" SortExpression="articleID" Visible="False" />
        <asp:BoundField DataField="Title" HeaderText="عنوان" SortExpression="Title" />
        <asp:CheckBoxField DataField="IsActive" HeaderText="وضعیت" SortExpression="IsActive" />
        <asp:TemplateField HeaderText="ادامه مطلب">
          <ItemTemplate>
            <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl='<%# Eval("articleID", "~/showarticle.aspx?id={0}") %>'>ادامه مطلب</asp:HyperLink>
          </ItemTemplate>
        </asp:TemplateField>
      </Columns>
      <FooterStyle BackColor="#CCCC99" ForeColor="Black" />
      <HeaderStyle BackColor="#333333" Font-Bold="True" ForeColor="White" />
      <PagerStyle BackColor="White" ForeColor="Black" HorizontalAlign="Right" />
      <SelectedRowStyle BackColor="#CC3333" Font-Bold="True" ForeColor="White" />
      <SortedAscendingCellStyle BackColor="#F7F7F7" />
      <SortedAscendingHeaderStyle BackColor="#4B4B4B" />
      <SortedDescendingCellStyle BackColor="#E5E5E5" />
      <SortedDescendingHeaderStyle BackColor="#242121" />
    </asp:GridView>
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
      ConnectionString="<%$ ConnectionStrings:DataConnectionString %>" 
      SelectCommand="SELECT * FROM [articles]">
    </asp:SqlDataSource>

برای مشاهده توضیحات مقاله صفحه showarticle.aspx را ایجاد کرده و کد های زیر را می نویسیم:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
DataKeyNames="articleID" DataSourceID="SqlDataSource1" GridLines="None" 
Width="100%" ShowHeader="False">
            <Columns>
                <asp:TemplateField>
                    <ItemTemplate>
                        <table cellspacing="0" 
class="auto-style1" dir="ltr" 
style="font-family: tahoma; font-size: 8pt; line-height: 25px;">
                            <tr>
                                <td dir="rtl" style="font-weight: bold">
                                    <asp:Label ID="Label1" runat="server"
 Text='<%# Eval("Title", "{0}") %>'></asp:Label>
                                </td>
                            </tr>
                            <tr>
                                <td dir="rtl">
                                    <asp:Label ID="Label2" runat="server" 
Text='<%# Eval("Descriptions", "{0}") %>'></asp:Label>
                                </td>
                            </tr>
                            <tr>
                                <td dir="ltr">
                                    <asp:Button ID="btnDisLike" runat="server" 
CommandArgument="<%# Container.DataItemIndex %>"
 Font-Names="Tahoma"  Font-Size="8pt" Text="نمیپسندم"  OnClick="btnDisLike_Click" />
                                    <asp:Button ID="btnLike" runat="server" 
CommandArgument="<%# Container.DataItemIndex %>"
 Font-Names="Tahoma" Font-Size="8pt" Text="میپسندم"  OnClick="btnLike_Click"/>
                                </td>
                            </tr>
                        </table>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
            ConnectionString="<%$ ConnectionStrings:DataConnectionString %>" 
            SelectCommand="SELECT * FROM [articles]
 WHERE ([articleID] = @articleID)">
            <SelectParameters>
                <asp:QueryStringParameter Name="articleID" 
QueryStringField="id" Type="Int32" />
            </SelectParameters>
        </asp:SqlDataSource>

برای اینکه هر کاربر تنها یکبار بتواند برای هر مقاله رای دهد کد زیر را می نویسیم:

private bool LikeVoted(string userIP, int articleId)
    {
        bool flag;
        using (DataBaseContext db = new DataBaseContext())
        {
            db.likes.Where(current => current.IpAddress == userIP
 && current.articleID == articleId).Load();
            if (db.likes.Local.Count() != 0)
                flag = true;
            else
                flag = false;
        }
        return flag;
    }

دقت کنید که فضای نام زیر را وارد کرده باشید:

using System.Data.Entity;

تابع بالا بررسی می کند که کاربری با IP مورد نظر قبلا رای داده است یا خیر.در صورتی که قبلا رای داده باشد مقدار True و در غیر اینصورت مقدار False را برمیگرداند

مشابه تابع بالا برای دکمه dislike وضعیت را بررسی می کنیم:

private bool disLikeVoted(string userIP, int articleId)
    {
        bool flag;
        using (DataBaseContext db = new DataBaseContext())
        {
            db.dislikes.Where(current => current.IpAddress == userIP
 && current.articleID == articleId).Load();
            if (db.dislikes.Local.Count() != 0)
                flag = true;
            else
                flag = false;
        }
        return flag;
    }

در رویداد کلیک دکمه لایک کد زیر را برای ثبت رای می نویسیم:

using (DataBaseContext db = new DataBaseContext())
        {
            Button m = (Button)sender;
            int i = Int32.Parse(m.CommandArgument);
            Button btnLike = (Button)GridView1.Rows[i].FindControl("btnLike");
            int id = int.Parse(Request.QueryString["id"]);                
            like obj = new like();
            obj.articleID = id;
            db.likes.Add(obj);
            db.SaveChanges();
            string Msg = "رای شما با موفقیت ثبت شد";
            ScriptManager.RegisterStartupScript(Page, typeof(Page),
            "Alert", "<script>alert('" + Msg + "');</script>", false);
            int articleId = int.Parse(Request.QueryString["id"]);
            string userIp = HttpContext.Current.Request.UserHostAddress;
            if (LikeVoted(userIp, articleId))
                btnLike.Enabled = false;
        }

همچنین در رویداد کلیک دکمه dislike کد زیر را می نویسیم:

using (DataBaseContext db = new DataBaseContext())
        {
            Button m = (Button)sender;
            int i = Int32.Parse(m.CommandArgument);
            Button btnDisLike = (Button)GridView1.Rows[i].FindControl("btnDisLike");
            int id = int.Parse(Request.QueryString["id"]);
            dislike obj = new dislike();
            obj.articleID = id;
            db.dislikes.Add(obj);
            db.SaveChanges();
            string Msg = "رای شما با موفقیت ثبت شد";
            ScriptManager.RegisterStartupScript(Page, typeof(Page),
            "Alert", "<script>alert('" + Msg + "');</script>", false);
            int articleId = int.Parse(Request.QueryString["id"]);
            string userIp = HttpContext.Current.Request.UserHostAddress;
            if (disLikeVoted(userIp, articleId))
                btnDisLike.Enabled = false;
        }

 در رویداد GridView1_RowDataBound کد زیر را برای بررسی رای کاربران می نویسیم:

GridViewRow row = e.Row;
        if (row.DataItem == null)
            return;
        Button btnLike = (Button)row.FindControl("btnLike");
        Button btnDisLike = (Button)row.FindControl("btnDisLike");
        int articleId = int.Parse(Request.QueryString["id"]);
        string userIp = HttpContext.Current.Request.UserHostAddress;
        if (LikeVoted(userIp, articleId))
            btnLike.Enabled = false;
        if (disLikeVoted(userIp, articleId))
            btnDisLike.Enabled = false;

 

با تشکر www.astanweb.ir

فایل های ضمیمه

hamzeh ghamkhar

نویسنده 3 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید