【问题标题】:Handling Like and Unlike of an entity in ASP.NET MVC using AJAX使用 AJAX 在 ASP.NET MVC 中处理实体的 Like 和 Unlike
【发布时间】:2016-02-16 05:15:14
【问题描述】:

我有一个剃刀视图,其中模型是产品的 IEnumerable,所以我只是在模型上使用 foreach 循环列出视图中的所有产品。除了每个产品,您可以在下面看到我正在显示它有多少 ThumbsUps 的计数。我要完成的最后一件事是,当他们单击“Give Thumbs Up”链接时,我想将 ProductThumbsUp 记录添加到当前登录用户的数据库中。如果用户已经竖起大拇指并再次点击它,我想从产品中删除他们的 ProductThumbsUp。

我正在使用 EntityFramework 7 和 MVC6。我有两个表:Product 和 ProductThumbsUp。

我想知道当当前登录的用户点击使用 MVC 的链接时,我应该如何为他们添加 ProductThumbsUp 记录。我假设这样的事情绝对应该是一个 AJAX 帖子。但是我只是想将 ProductId 发送到 AJAX 帖子吗?然后在我的控制器中创建一个新的 ProductThumbsUp 并设置它的 ProductId。然后将新创建的 ProductThumbsUp 对象和当前登录的用户都发送到我的存储库层进行保存。

我想知道是否有更好的方法来做到这一点,因为我的模型中的每个帖子都已经附有一个 ThumbsUps 列表。有没有更好的方法可以做到这一点?

这是我的剃刀视图的设置方式:

@model IEnumerable<Product>
@foreach (var product in Model)
{
    <h2>@product.Name</h2>
    <div>@product.Description</div>
    <a href="#" class="lnkViewLikes"># of Thumbs Ups Given:<span class="badge">@product.ThumbsUps.Count()</span></a>

    <a href="#" class="lnkThumbsUp">Give Thumbs Up</a>
}

这是我的产品模型的样子:

public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }

public ICollection<ProductThumbsUp> ThumbsUps { get; set; }

【问题讨论】:

  • 你的建议听起来是正确的方法。

标签: c# ajax asp.net-mvc entity-framework razor


【解决方案1】:

为了提高效率,

我建议获取所有产品,而不是从 DB 获取每个产品的所有赞数行,而是获取每个产品的点赞数。

因为您不需要每一行的thumbsUp,而只需要显示的计数。想象一下规模的场景,如果您对一个产品有 100 万个赞,突然间您从数据库中拉出 100 万行数据到您的服务器 - 只是为了显示计数。

我还会再次调用数据库以获取当前用户给出的所有赞许(他喜欢的产品 ID 列表)。这将允许您向用户展示他们是否喜欢它或现在。

要将实际的竖起大拇指添加到产品 - 您可以发送一个 ajax 调用,告诉他喜欢哪个产品 ID,并且 mvc 操作可以将竖起大拇指行插入数据库。

【讨论】:

  • 很好的回应,让我思考。当用户实际竖起大拇指时,它会是控制器的 AJAX POST 吗?此外,就向用户展示他已经赞许的产品而言,我喜欢只进行第二次数据库调用以获得所有用户的喜欢的想法,但是拥有一个具有以下内容的 ViewModel 不是更容易吗: Id, Name, Description, ICollection ThumbsUps, bool: UserLikes 然后在控制器的 GET 方法中从数据库中检索所有产品及其喜欢后执行查询并设置 UserLikes 属性然后传递给查看?
  • 你能告诉我我的 ViewModel 在我列出所有产品的 Index.cshtml 中应该是什么样子吗?在我的控制器的 GET Index 方法中,我假设我需要做的不仅仅是从数据库中获取所有产品。假设我运行第二个查询以获取当前登录用户喜欢的所有 ProductId。这也应该是 ViewModel 属性吗?
  • 给这只猫剥皮的方法很多。一种方法 - 索引 ViewModel 可以具有 ProductViewModel 的 IEnumerable。其中有 Id、Name、Description、Count 来显示产品。还有另一个布尔 LikedByCurrentUser。根据当前用户是否喜欢它是真/假。
  • 完美 我在想这样的事情!因此,在检索到我想要列出的所有产品以及用户喜欢的所有产品之后,我将使用 linq 查询设置 LikedByCurrentUser,我会在 id 匹配的位置进行查询并将这些设置为 LikedByCurrentUser。我知道这是一个一般/广泛的问题,但我非常感谢你让我的大脑正确思考。看来我的路不错!
  • Moxplod 最后一个问题,因为它给我带来了一些困惑。当您说只是获取计数而不是其他一切更高效时,您的意思是仅设置 ViewModel 的计数还是您的意思是从数据库中不执行包含而仅直接从 sql 获取计数
【解决方案2】:

最简单的方法是创建两个标签

竖起大拇指 删除竖起大拇指

并使用 javascript 或 jquery 切换它。 同样使用jquery ajax调用方法来添加和删除计数(可以使用相同的方法使用标志) 使用相同的方法可以返回新的 Count 并绑定它

【讨论】:

  • 这就是我做事的方式。谢谢你为我确认。我将使用您所说的 2 个链接和一个处理 ajax 帖子中所有内容的函数,然后在成功时更新计数。
猜你喜欢
  • 2017-08-07
  • 2017-12-31
  • 1970-01-01
  • 2014-06-27
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
  • 2011-06-10
  • 2012-03-30
相关资源
最近更新 更多