MVC4:部分视图中的子模型具有相同的ID(为文章创建注释)

时间:2013-05-16 18:00:40

标签: asp.net-mvc-4 razor

我有文章模型和评论模型。 ArticleDetail视图显示文章,文章评论和创建新评论的公式。

为文章创建新评论时,它与文章具有相同的ID。 在公共ActionResult DisplayCreateComment(CommentModel注释,int articleID) CommentModel与文章具有相同的ID。

因此,每个发布的评论都将具有相同的ID,但这不起作用。为什么评论与文章相同,我该如何解决?

CommentModel:

    public class CommentModel
    {
        public int ID { get; set; }
        public string Text { get; set; }
        public DateTime DateTime { get; set; }
        public Article Art { get; set; }
     }

ArticleModel:

public class ArticleModel
{
        public int ID { get; set; }
        public DateTime DateTime { get; set; }
        public ICollection<CommentModel> Comments { get; set; }
        public string Text { get; set; }
        public string Title { get; set; }
...
}

ArticleDetail查看:

...
@Html.Partial("DisplayComments", Model.Comments)
@Html.Action("DisplayCreateComment", "Home", new { articleID = Model.ID })
...

HomeController中:

public ActionResult DisplayCreateComment(int articleID)
    {            
        return PartialView();
    }

    [HttpPost]
    public ActionResult DisplayCreateComment(CommentModel comment, int articleID)
    {
        ... 
     //There the CommentModel has the same ID as the Article Model ...


    }

1 个答案:

答案 0 :(得分:0)

您的ArticleId需要CommentModel。除了您已有的内容之外,还要将以下内容添加到CommentModel

[ForeignKey("ArticleModel"), DatabaseGenerated(DatabaseGeneratedOption.None)]
public int ArticleId { get; set; }

public virtual ArticleModel ArticleModel { get; set; }

此处有关您的问题的更多帮助:

Matt Blagden From Zero to Blog in 100 Minutes。 这可以帮助您创建整个博客,但它不使用Entity Framework Code First

Scott Allen's Plural Sight Video。 您可以使用试用版。这将向您展示如何实现one-to-many个对象。有DepartmentEmployee您可以创建部门(文章),然后以相同的方式添加员工(评论)。

基本上,您必须首先创建文章,然后在文章详细信息中添加评论。您所要做的就是在文章详细信息中有Create link

@Html.ActionLink("Create an comment", "Create", "Comment", 
                 new {ArticleId = @Model.ArticleId}, null)

在Models文件夹/ ViewModels文件夹中创建CommentViewModel类

public class CreateCommentViewModel 
{
    [HiddenInput(DisplayValue = false)]
    public int ArticleId { get; set; }

    [Required]
    public string Text { get; set; }        
}

然后,让Comment Controller中的Create Actions看起来像这样;

    [HttpGet]        
    public ActionResult Create(int articleId)
    {
        var model = new CreateCommentViewModel();
        model.ArticleId= articleId;
        return View(model);
    }

    [HttpPost]
    public ActionResult Create(CreateCommentViewModel viewModel)
    {
        if(ModelState.IsValid)
        {
            var db = new EfDb();

            var article= _db.Articles.Single(d => d.Id == viewModel.ArticleId);
            var comment= new Comment();
            comment.Text = viewModel.Text;
            comment.DateTime = DateTime.UtcNow;
            article.Comments.Add(comment);

            db.SaveChanges();

            return RedirectToAction("detail", "article", new {id = viewModel.ArticleId});
        }
        return View(viewModel);
    }