0

我正在尝试使用 MVC 制作一个简单的论坛,但我无法弄清楚为什么发布回复的用户会被重复。

这是回复操作:

[HttpPost]
    public ActionResult Reply(string Title, string Content,int ReplyTo)
    {
        Post masterPost = db.Posts.FirstOrDefault(p => p.PostID == ReplyTo);
        Post post = new Post();
        post.PostID = 0;
        post.CreatedOn = DateTime.Now;
        post.ModifiedOn = DateTime.Now;
        post.ReplyTo = masterPost;
        post.Forum = db.Forums.FirstOrDefault(f=>f.ForumID == masterPost.Forum.ForumID);
        post.User = (User)Session["User"];
        post.Title = Title;
        post.Content = Content;

        //if (ModelState.IsValid)
        //{
            db.Posts.Add(post);
            db.SaveChanges();
            return RedirectToAction("View", "Posts", new { id = ReplyTo });
        //}
        return View(post);
    }

这是 Post 实体:

public class Post
{
    [Key]
    public int PostID { get; set; }
    public string Title { get; set; }
    [DataType(DataType.MultilineText)]
    public string Content { get; set; }
    public DateTime CreatedOn { get; set; }
    public DateTime? ModifiedOn { get; set; }
    public virtual Forum Forum { get; set; }
    public virtual User User { get; set; }
    public virtual Post ReplyTo { get; set; }
}

这是用户实体:

public class User
{
    public int UserID { get; set; }
    public string Name { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
    public string Email { get; set; }
    public DateTime RegisteredOn { get; set; }
}

每当调用ReplyTo 操作时,它都会创建帖子,但它也会复制存储在会话中的用户(具有不同的用户ID)。

另外,我对ModelState.IsValid进行了评论,因为由于某种原因,尽管实体已完全填充并且没有可能导致其无效的 DataAnnotations,但它始终返回为 false。

编辑 这是ModelState的错误: {“从类型'System.String'到类型'Models.Post'的参数转换失败,因为没有类型转换器可以在这些类型之间转换。”}

我究竟做错了什么?

先谢谢了。

4

1 回答 1

0

我可以告诉你为什么 ModelState 无效。您不必拥有 DataAnnotations 即可使属性成为必需。由于您不能将原语设置为 null,因此它们也算作“必需”属性,如果未提供任何属性,则 ModelState 将变为无效。

在上面的示例中,我认为您没有发布 CreatedOn 或 PostId 属性(或两者)。由于您只发布了两个对您有价值的属性(标题和内容),因此您最好创建一个仅包含这两个属性的简单视图模型。如果您不想这样做,即使接受两个命名参数也会更好。

以下是使用视图模型的示例。请注意,您可以将 ReplyTo 属性添加到视图模型。

public class PostViewModel
{
    public int ReplyTo {get; set;}
    public string Title { get; set; }
    [DataType(DataType.MultilineText)]
    public string Content { get; set; }
 }

你可以像这样使用它:

    [HttpPost]
    public ActionResult Reply(PostViewModel viewModel)
    {
        Post masterPost = db.Posts.FirstOrDefault(p => p.PostID == viewModel.ReplyTo);
        Post post = new Post();
        post.PostID = 0;
        post.CreatedOn = DateTime.Now;
        post.ModifiedOn = DateTime.Now;
        post.ReplyTo = masterPost;
        post.Forum = db.Forums.FirstOrDefault(f=>f.ForumID == masterPost.Forum.ForumID);
        post.User = (User)Session["User"];
        post.Title = viewModel.Title;
        post.Content = viewModel.Content;

        if (ModelState.IsValid)
        {
            db.Posts.Add(post);
            db.SaveChanges();
            return RedirectToAction("View", "Posts", new { id = ReplyTo });
        }
        return View(post);
    }

至于被复制的用户,我认为原因是 User 类中缺少 Key 属性。

于 2013-02-08T16:16:37.267 回答