引入viewmodel会崩溃应用程序

时间:2012-06-28 19:21:42

标签: c# asp.net-mvc-3

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

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

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

但是,当我这样做时,博客显示页面不会显示,因为它需要一个类型为“BlogDetailViewModel”的模型。我想这是因为'Blog'控制器的'Details'动作是将'blog'模型传递给视图而不是'BlogDetailViewModel'。如何更正此错误。

这是处理这个问题的最佳方式。

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

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

public ViewResult Details(int id)
{

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

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; }
    }

Comment.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;
}

...

我试图通过博客详细信息视图对所有内容进行评论,并保留标题。但是,即使这样也行不通。

任何帮助都会感激不尽。

2 个答案:

答案 0 :(得分:2)

您的视图具有设置为ViewModel类的强类型模型,但您只返回操作中的Blog对象。要修复错误,请执行以下操作之一:

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

所有这些都是简单的选择,因此由您决定。

答案 1 :(得分:2)

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

public ViewResult Details(int id)
{
    Blog blog = db.Blogs.Find(id);
    BlogDetailViewModel viewModel = new BlogDetailViewModel {Blog = blog, Comment = ""};
    return View(viewModel);
}