gpt4 book ai didi

c# - 简单的 MVC 评论审核

转载 作者:太空狗 更新时间:2023-10-30 00:54:53 26 4
gpt4 key购买 nike

我有一种简单(也可能是粗糙)的方式来管理我正在构建的博客上的评论。这是一个学习/有趣的项目,所以我正在尽我所能来熟悉一些不同的技术。我想知道我的逻辑是否有任何漏洞,或者我正在做的事情是否有更好的实现。我将允许在网站上发表匿名评论,但我想对我认为不合适的任何内容进行审核。这是我的做法:

我的模型使用 EF 代码优先方法:

public class Comment
{
public int Id { get; set; }
public bool Moderated { get; set; }
public string DisplayName { get; set; }
public string Email { get; set; }
public DateTime DateCreated { get; set; }
public string Content { get; set; }
public int PostId { get; set; }
public Post Post { get; set; }
}

这里是标准的东西。然后我创建了一个 ViewModel 来显示博客文章的详细信息以及页面上与之相关的所有评论,如下所示:

public class PostCommentViewModel
{
public Post Post { get; set; }
public List<Comment> Comment { get; set; }

public PostCommentViewModel(int postId)
{
var db = new BlogContext();

Post = db.Posts.First(x => x.Id == postId);
var query = from x in db.Comments where x.PostId == postId && x.Moderated == true select x;

Comment = query.ToList();
}
}

对于评论,这只抓取与 PostId 相关且已审核的评论(即我已经能够审核它们)

对于显示这个的 View ,我只使用了一个基础脚手架模板:

public ActionResult Details(int id = 0)
{
var viewModel = new PostCommentViewModel(id);
return View(viewModel);
}

cshtml:

@model CodeFirstBlog.ViewModels.PostCommentViewModel


<fieldset>
<legend>PostCommentViewModel</legend>
@Html.DisplayFor(x => x.Post.Title)
<br />
@Html.DisplayFor(x => x.Post.Content)
<br />
@Html.DisplayFor(x => x.Post.CreatedDate)
<hr />
@foreach(var comment in Model.Comment)
{
@Html.DisplayFor(x => comment.Content)
<br />
@Html.DisplayFor(x => comment.DateCreated)
<br />
@Html.DisplayFor(x => comment.DisplayName)
<br />
@Html.DisplayFor(x => comment.Email)
<br />
<hr />
}

</fieldset>
@Html.ActionLink("Add Comment", "AddComment", new { id = Model.Post.Id} )

这是Controller中的AddComment

public ActionResult AddComment(int id = 0)
{
return View();
}

[HttpPost]
public ActionResult AddComment(Comment comment, int id)
{
if (ModelState.IsValid)
{
comment.PostId = id;
db.Comments.Add(comment);
db.SaveChanges();
return RedirectToAction("Details", "Blog", new { id = id });
}
return RedirectToAction("Details", "Blog", new { id = id });
}

因此,当我添加评论时,Moderated 默认为 false,因此评论不会立即显示。现在,如果管理员登录,他可以转到 ViewModeration View ,该 View 只返回所有等待批准的评论的列表:

public ActionResult ViewModeration()
{
var comments = from x in db.Comments where x.Moderated == false select x;
return View(comments);
}

如果他点击批准按钮,它会在 Controller 中执行:

 public ActionResult ApproveComment(int id)
{
Comment c = (from x in db.Comments
where x.Id == id
select x).First();
c.Moderated = true;
db.SaveChanges();
return RedirectToAction("ViewModeration");
}

我真正想知道的是:

  1. 此实现中是否存在任何漏洞,例如知情用户是否可以覆盖回发中的审核值?
  2. 是否有更简单或更优雅的解决方案可供遵循?同样,我不想使用任何预建的东西。这个项目的重点是学习东西。

最佳答案

到目前为止,该模型似乎暂缓,所以我将这样回答问题:

此实现中是否存在任何漏洞,例如知情用户是否可以覆盖回发中的适度值?

是的。我没有基于您发送的任何 FORM 代码,但我假设您正在通过发布值创建评论并直接保存到数据库中。这可能很糟糕。您最好只从用户那里获取您需要的值,然后将其余值填充到 Controller 中:

public ActionResult AddComment(Comment comment, int id)
{
if (ModelState.IsValid)
{
// NEW
comment.Moderated = false;

comment.PostId = id;
db.Comments.Add(comment);
db.SaveChanges();
return RedirectToAction("Details", "Blog", new { id = id });
}
return RedirectToAction("Details", "Blog", new { id = id });
}

是否有更简单或更优雅的解决方案可供遵循?同样,我不想使用任何预建的东西。这个项目的重点是学习东西。

如前所述,到目前为止这看起来不错。但是,出于可重用性和测试目的,我可能会在不同的类中获取数据库操作,例如服务或存储库。

所以,代码看起来像这样:

public ActionResult AddComment(Comment comment, int id)
{
if (ModelState.IsValid)
{
CommentService.Save(comment);
return RedirectToAction("Details", "Blog", new { id = id });
}
return RedirectToAction("Details", "Blog", new { id = id });
}

这不是一个大的变化,但从某种意义上说,如果您想重用这段代码,它会给您带来更大的灵 active 。

至于您的 PostCommentViewModel 类,我不会在 ViewModel 中执行任何操作,尤其是在构造函数中。您应该使用 ViewModel 的方式是将数据绑定(bind)到它上面,而不是让 ViewModel 完成这项工作。无论如何,您都可以从中获取数据,ViewModel 仅代表需要显示的结构。因此,从那里获取代码,并将其放入服务(即 CommentService)中。

关于c# - 简单的 MVC 评论审核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11265955/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com