0

我正在尝试自学 C# 和 MVC 3。

我通过创建一个简单的博客应用程序来学习。我被困在博客的详细信息页面。此页面显示帖子并且工作正常 - 即显示帖子和帖子上的评论。但是,我想添加一个表单来添加新评论。

我认为这样做的方法是创建一个包含博客和评论类的视图模型,然后我应该能够创建一个调用评论控制器的创建操作的评论表单。

但是,当我这样做时,博客显示页面不会显示,因为它需要一个“BlogDetailViewModel”类型的模型。我猜这是因为“博客”控制器的“详细信息”操作将“博客”模型传递给视图,而不是“博客详细视图模型”。我该如何纠正这个错误。

这是处理这个问题的最好方法吗。

我正在详细说明以下所有代码:

博客控制器 - 详细信息方法

public ViewResult Details(int id)
{

    Blog blog = db.Blogs.Find(id);
    return View(blog);
}

博客.cs

 public class Blog
    {
        public int BlogID { get; set; }
        public string Title { get; set; }
        public string Writer { get; set; }

        [DataType(DataType.MultilineText)]
        public string Excerpt { get; set; }

        [DataType(DataType.MultilineText)]
        public string Content { get; set; }

        [DataType(DataType.Date)]
        public DateTime PublishDate { get; set; }

        public virtual ICollection<Comment> Comments { get; set; }
    }

评论.cs

 public class Comment
    {
        public int CommentID { get; set; }
        public string Name { get; set; }

        [DataType(DataType.EmailAddress)]
        public string Email { get; set; }

        [DataType(DataType.MultilineText)]
        public string CommentBody { get; set; }

        public int BlogID { get; set; } 
        public virtual Blog Blog { get; set; }
    }

BlogDetailViewModel.cs

public BlogDetailViewModel
{
    public Blog Blog{ get; set; }
    public Comment comment{ get; set; }
}

博客详情视图

@model NPLHBlog.ViewModels.BlogDetailViewModel

@{
    ViewBag.Title = @Model.Blog.Title;
}

……

我试图从博客详细信息视图中评论所有内容并保留标题。然而,即使这样也行不通。

任何帮助将不胜感激。

4

2 回答 2

2

您的视图将强类型模型设置为 ViewModel 类,但您从操作中仅返回一个 Blog 对象。要修复错误,请执行以下任一操作:

  • 创建一个接受 Blog 对象的新视图。
  • 修改您的视图以接受 Blog 对象。
  • 修改您的操作以实例化 ViewModel 对象并设置该对象(博客、评论)上的变量以将其传递给视图。

所有这些都是简单的选择,所以这取决于你。

于 2012-06-28T19:23:48.140 回答
2

传递给View()控制器​​的类型必须与@model视图中的类型匹配。

public ViewResult Details(int id)
{
    Blog blog = db.Blogs.Find(id);
    BlogDetailViewModel viewModel = new BlogDetailViewModel {Blog = blog, Comment = ""};
    return View(viewModel);
}
于 2012-06-28T19:27:20.080 回答