如何在 Asp .net 核心网站(如博客)中制作喜欢/不喜欢按钮?

Posted

技术标签:

【中文标题】如何在 Asp .net 核心网站(如博客)中制作喜欢/不喜欢按钮?【英文标题】:How can I make a Like/Dislike button in an Asp .net core web site like a blog? 【发布时间】:2021-08-02 08:49:42 【问题描述】:

我是使用 .net core mvc 进行 Web 开发的新手,我正在构建一个与 Wordpress 非常相似的 Web 应用程序。

基本上,我正在构建一个网站,管理员将在其中发布文章,用户将在那里阅读这些文章。 我现在必须制作一个“喜欢”按钮和一个“不喜欢”按钮,让读者发表意见。目前该过程非常简单,我在数据库中创建了一个 Article 表,并在其中添加了两列:NumberOfLikes 和 NumberOfDislikes。 然后我在文章页面上添加了两个按钮。我现在想要的就像我说的那样,以确保当我们点击喜欢按钮时,它会为 NumberOfLikes 添加 +1,反之,当我们点击不喜欢按钮时,它会添加 +1 NumbreOfDislikes。

我似乎无法弄清楚如何使用此功能,这就是我向您寻求帮助的原因。 提前致谢。

编辑

这是Article Model class 类:

public class Article
    public long Id get; set; 
    public long NumberOfLikes get; set; 
    public long NumberOfDisLikes get; set; 

这是ArticleController.cs 中的Index 操作

        public async Task<IActionResult> Index(long id)
        
            Article article = await _context.Articles
                                            .Where(a => a.Id == id)
                                            .FirstOrDefaultAsync();
            if (article == null)
            
                return NotFound();
            
            ArticleViewModel model = new ArticleViewModel();
            model.Article = article;

            await GetDataForLayout(_context);
            await _context.SaveChangesAsync();

            return View(model);
        

/Article/Index.cshtml 视图中,我们有两个这样的按钮:

    <div>
        <button class="btn btn-success like-article">
            <i class="fas fa-thumbs-up"></i>
            <span>Like &nbsp; @article.NumberOfLikes</span>
        </button>
        <button class="btn btn-danger dislike-article">
            <i class="fas fa-thumbs-down"></i>
            <span>DisLike &nbsp; @article.NumberOfDisLikes</span>
        </button>
    </div>

我不知道输入@article.NumberOfLikes 是否可以让我看到更新后的值,但这是我想要的值。 所以我想点击这些按钮并更新文章的NumberOfLikes/NumberOfDislikes 的值而不更改页面或刷新它并使读者可以看到更改。

【问题讨论】:

【参考方案1】:

您可以使用替换按钮,尝试传递id和喜欢或不喜欢的动作,然后更新文章。这是一个带有efcore的演示:

文章:

public class Article
    
        public int Id  get; set; 
        public int NumberOfLikes  get; set; 
        public int NumberOfDislikes  get; set; 

    

动作:

public async Task<IActionResult> Index()
        

            return View(_context.Article.ToList());

        
        public async Task<List<Article>> Edit(int id, bool like)
    
        var article = await _context.Article.FindAsync(id);
        if (like)
        
            article.NumberOfLikes++;
        
        else 
            article.NumberOfDislikes++;
        
        _context.Update(article);
        await _context.SaveChangesAsync();
        return _context.Article.ToList();

    

Index.cshtml:

    @model IEnumerable<WebApplication_efcore.Models.Article>
    <<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Id)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.NumberOfLikes)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.NumberOfDislikes)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody id="tbody1">
        @foreach (var item in Model)
        
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Id)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.NumberOfLikes)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.NumberOfDislikes)
            </td>
            <td>
                <button onclick="Edit(@item.Id,true)">Like</button>
                <button onclick="Edit(@item.Id,false)">Dislike</button>
            </td>
        </tr>
        
    </tbody>
</table>
<script>
    function Edit(id,like)
    
       $.ajax(
                type: "POST",
                data:  id: id, like: like ,
                url: 'Edit',
       ).done(function (result) 
                var html=""
                for (var i = 0; i < result.length; i++)
                
                    html += '<tr><td>' + result[i].id + '</td><td>' + result[i].numberOfLikes + '</td><td>' + result[i].numberOfDislikes + '</td><td><button onclick="Edit(' + result[i].id + ',true)">Like</button><button onclick="Edit(' + result[i].id +',false)">Dislike</button></td></tr>'
           
           document.getElementById("tbody1").innerHTML = html;
            );
    
</script>

结果:

【讨论】:

感谢@Yiyi 的回答。这是一个好主意,但它并没有完全符合我的要求。我会进行编辑,你应该明白。实际上我想在不刷新页面的情况下增加值。 你的意思是不想在视图中刷新更新的值,只想在db中更新? 我想在视图和数据库中刷新这些值,但不更改页面或刷新它。 如果要更改视图中的值,我们通常会刷新视图。因为更改html代码会更复杂。 我读到使用 AJAX 我们可以在不重新加载整个页面的情况下更改 DOM。但我不知道它是如何工作的。

以上是关于如何在 Asp .net 核心网站(如博客)中制作喜欢/不喜欢按钮?的主要内容,如果未能解决你的问题,请参考以下文章

请推荐几个asp.net下做网站的好的开源框架

如何在我的 ASP.NET 核心 WebApi 项目中全局启用 CORS

asp.net BS项目如何制作成安装程序?该安装文件只允许一个电脑安装又如何做吗

如何实现ASP.NET中网站访问量的统计

为啥图像不显示在我的 ASP.Net 核心网站上?

如何编辑默认的asp.net核心错误标签[重复]