作为我正在研究的项目的一部分,用户可以创建一个帖子,然后其他用户可以单击“喜欢”或“不喜欢”按钮。
下面的代码是Post.cs类,负责将表添加到数据库中。
public class Post
{
//The post ID
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int postId { get; set; }
// Foreign key to customer
public string Id { get; set; }
public string Email { get; set; }
public string postTitle { get; set; }
public string postBody { get; set; }
public string postDepartment { get; set; }
public string postCategory { get; set; }
public bool postAnonymous { get; set; }
public int postLikes { get; set; }
public int postDislikes { get; set; }
public DateTime postDate { get; set; }
}
以下代码是链接到两个按钮的后端C#代码。
protected void btnLike_Click(object sender, EventArgs e)
{
}
protected void btnDislike_Click(object sender, EventArgs e)
{
}
我正在尝试让按钮在每次单击时使数据库中的整数值增加+1,并且用户应该只能单击任一按钮,而又不能多次//不喜欢//。>
我将如何尝试使用asp.net网络表单成功完成此操作。
<------------------编辑-------------------------> < / p>
protected void btnLike_Click(object sender, EventArgs e)
{
var postIDforLike = // add logic to get the id of the post to increment the likes
using (var _dbContext = new ApplicationDbContext())
{
var addLikeSql = "update post set postLikes = postLikes + 1 where postID = @id";
var paramID = new SqlParameter("@id", postIDforLike);
_dbContext.Database.ExecuteSqlCommand(addLikeSql, paramID);
}
}
<-------------------------- EDIT2 ------------------- ---->
<asp:Button ID="btnLike" class="btn btn-primary" runat="server" Text=" Like" Width="99.99px" OnClick="btnLike_Click" />  <asp:Button ID="btnDislike" Width="99.99px" class="btn btn-primary" runat="server" Text="Dislike " OnClick="btnDislike_Click" />
</div>
<br />
<%--------------------------------------
Inserting Comment Information
--------------------------------------%>
<div class="col-md-12">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title text-center">Add Comment</h3>
</div>
<div class="panel-body">
<fieldset>
<table class="nav-justified">
<tr>
<td class="modal-sm" style="width: 237px; height: 21px;">
<label for="commentBody" class="col-lg-2 control-label">Comment:</label></td>
<td style="width: 434px; height: 21px;">
<asp:TextBox Width="400px" style="resize:none;" class="form-control" ID="commentBody" runat="server" placeholder="Body" TextMode="MultiLine"></asp:TextBox>
</td>
<td style="height: 21px">
<asp:RequiredFieldValidator controltovalidate="commentBody" ID="commentBodyValidator" runat="server" ErrorMessage="*Comment is required" ForeColor="Red"></asp:RequiredFieldValidator>
</td>
</tr>
</table>
<br />
<table class="nav-justified">
<tr>
<td style="height: 21px; width: 511px">
<label for="commentAnonymous" class="col-lg-2 control-label" style="left: 0px; top: 0px; width: 538px">Would you like this comment to be submitted anonymously?:</label></td>
<td style="height: 21px; width: 104px">
<asp:RadioButtonList ID="commentAnonymous" runat="server" BorderStyle="None" CellPadding="0" CellSpacing="0">
<asp:ListItem Value="1" Text="Yes">Yes</asp:ListItem>
<asp:ListItem Value="0" Text="No">No</asp:ListItem>
</asp:RadioButtonList>
</td>
<td style="height: 21px"><asp:RequiredFieldValidator controltovalidate="commentAnonymous" ID="commentAnonymousValidator" runat="server" ErrorMessage="*Please select an option" ForeColor="Red"></asp:RequiredFieldValidator>
</td>
</tr>
</table>
<br />
<table class="nav-justified">
<tr>
<td class="modal-sm" style="width: 408px"> </td>
<td>
<button type="reset" class="btn btn-default">Cancel</button>
<asp:Button class="btn btn-default" ID="commentSubmitBtn" runat="server" autopostback="false" onclick="AddComment" Text="Submit" />
</td>
<td> </td>
</tr>
</table>
</fieldset>
<hr>
<table class="display" id="commentsTable">
<thead>
<tr>
<th>Comment</th>
<th>User</th>
<th>Date</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
答案 0 :(得分:0)
我假设您使用实体框架(基于post类中使用的属性)。
最简单的方法是加载实体,增加值,然后调用SaveChanges。但是,如果不使用锁定机制,这将非常低效且危险。
您可能正在寻找的是
update post set postLikes = postLikes + 1 where postID = @id
命令。这本来会更有效,因为您不必在更新Likes值之前每次都加载整个帖子。您可以使用上下文的Database.ExecuteSqlCommand执行这样的Sql Commands。
另一种可能的解决方案是通过添加“喜欢和不喜欢的表”来更改数据库模型,在其中为每个喜欢/不喜欢的人添加一条记录。要获得当前的点赞次数,您必须计算与该帖子相关的记录数。这样会增加开销,但具有的优点是您不会创建瓶颈,因为每次要更新like字段时,数据库都必须锁定您的帖子记录。
答案 1 :(得分:0)
///您需要有一个新表来处理类似用户帖子的内容 //具有UserId int PostId int的UserLike表喜欢或不喜欢,因此您不需要实体上的喜欢和不喜欢属性! //假设此操作可以由用户登录完成。
protected void btnLike_Click(object sender, EventArgs e)
{
//you need to get postId while button clicked...
DBContext db = new DbContext();
var user = Session["loggedUser"] as User ;
var didUserLike = db.Post.Where(p=>p.PostId == postId).Select(x=>x.UserId == user.UserId).FirstOrDefault());
if(didUserLike.Count() > 0){
//Operation like enable button disable button!
} //and if you want to do it for dislike..yes you can
}
对不起,我在这里没有工作室或代码,我无法控制。但是我认为您了解结构。祝你有美好的一天。
已编辑(已添加):
并且在视图中您不需要从enetiyt的属性中显示,因为可以通过查询来计算。这不适用于数据库设计。
,您可以这样做;
public int likeCountForPost(int id){
var postLikes = db.PostLikes.Where(x=>x.PostId == id && x.PostLike==1).Count();
return postLikes;
}
您也可以通过将不喜欢的返回计数仅更改为1到2来做到这一点。