asp.net mvc-C#mvc-用户在调用Reply时重复
本文关键字:Reply 调用 net mvc-C#mvc- 用户 asp | 更新日期: 2023-09-27 17:58:35
我正在尝试使用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);
}
这是邮政实体:
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操作时,它都会创建Post,但也会复制存储在会话中的User(使用不同的UserID)。
此外,我对ModelState.IsValid进行了注释,因为出于某种原因,它总是返回为false,尽管实体已完全填充,并且没有可能导致其无效的DataAnnotations。
编辑这是ModelState的错误:{"从类型"System.String"到类型"Models.Post"的参数转换失败,因为没有类型转换器可以在这些类型之间转换。"}
我做错了什么?
提前感谢。
我可以告诉您为什么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属性。