当需要两种类型的强类型时,该怎么办?

时间:2012-02-27 20:59:46

标签: c# asp.net-mvc asp.net-mvc-3 model-view-controller

我是mvc的新手,因为我正在设计一些类似博客的网络应用程序,我想知道一件更有经验的事情。问题是我有一个博客文章的视图和用于为其键入注释的框。完美的,抽象的解决方案是用一类文章和评论强烈地键入这个视图,但正如我们所知,这是不可能的。 处理这种情况的最佳方法是什么?因为它是文章的视图,所以应该用文章类输入。另一方面 - 使用注释类键入它并使用ViewBag传递文章字段会更容易。我不认为它是正确的,因为它不应该用类输入,这里没有直接表示(文章是主要的)。

有哪些其他可能的解决方案可以轻松添加和验证评论并以明确的方式执行此操作? 提前谢谢。

编辑:主要“问题”不是处理现有注释的列表,而是添加新注释 - 在这种情况下,我可以在控制器端轻松使用ViewModel FormCollection吗?

5 个答案:

答案 0 :(得分:6)

您将在此实例中使用ViewModel。像这样:

public class Article
{
    public string Text { get; set; }
}

public class Comment
{
    public string Text { get; set; }
}

public class BlogPostViewModel
{
    public Article Article { get; set; }
    public IEnumerable<Comment> Comments { get; set; }
}

ViewModel :域模型(或模型)[在您的情况下为CommentArticle]和视图[在您的情况下,您的博客帖子]之间的连接对象视图。

您的视图将如下所示:

@model BlogPostViewModel

@* you can reference Model.Article, as well as Model.Comments here *@

以下是ASP.NET MVC View Model Patterns的一个很好的工作示例。

编辑:然后使用Action方法接收您的POST数据:

[HttpPost]
public ActionResult YourBlogView(BlogPostViewModel bpvm)
{
    // here you have access to the binded model
    // i.e. bpvm.Article
}

答案 1 :(得分:2)

  

完美的,抽象的解决方案是用一类文章和评论强烈地键入这个视图,但正如我们所知,这是不可能的。

但这是可能的。它被称为ViewModel。

你似乎对CRUD模型有点担心。它看起来很主流,但那是因为它是唯一适合代码生成和模板化的方法。

要获得更好的视角,请查看标准MVC模板中的AccountModels。

答案 2 :(得分:2)

使用新模型:

public class ArticleAndCommentsModel {
    public ArticleModel Article { get; set; }
    public IEnumerable<CommentModel> Comments { get; set; }
}

您的观点将继承ViewPage<ArticleAndCommentsModel>

答案 3 :(得分:0)

我可以看到两个选项

  1. 使用文章和评论集合
  2. 创建一个viewmodel
  3. 将评论部分渲染为单独的视图(在同一页面上)

答案 4 :(得分:0)

其他人提出的ViewModel方法的替代方法是将Article放入ViewBag并从那里引用它,让Comment成为页面的模型。这假设用户不修改文章。