【问题标题】:What do when strong typing with two types needed需要两种类型的强类型时怎么办
【发布时间】:2012-02-27 20:59:45
【问题描述】:

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

还有哪些其他可能的解决方案可以轻松添加和验证 cmets 并以清晰的方式进行? 提前致谢。

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

【问题讨论】:

  • 为什么没有一个包含帖子和 cmets 类的 BlogPost 类?
  • 我认为组合是一个更好的解决方案,但是你可以继承多个接口而不是多个类。允许多接口继承。

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


【解决方案1】:

您将在本例中使用 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
}

【讨论】:

  • 好的,但我的问题(主要)是在同一个视图中添加评论。在这种情况下,我可以在控制器端使用 FormCollection 来处理那个新的吗?
  • @deha 您将使用输入(直接 DOM 或 InputExtensions)将此新数据 (cmets) 传递给 POST 操作。
  • 你能展示一些简单的代码示例吗?我主要对控制器方法参数感兴趣...
  • @deha 我已经编辑了我的帖子以展示简单的控制器操作方法。
  • 所以我猜 BlogPostViewModel 应该包含像 NewComment 这样的字符串字段,并在视图中为它渲染编辑器?
【解决方案2】:

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

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

您似乎对 CRUD 模型有点着迷。它看起来很主流,但那是因为它是唯一适用于代码生成和模板的方法。

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

【讨论】:

    【解决方案3】:

    使用新模型:

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

    您的视图将继承ViewPage&lt;ArticleAndCommentsModel&gt;

    【讨论】:

      【解决方案4】:

      我可以看到两个选项

      1. 使用文章和 cmets 集合创建视图模型
      2. 将评论部分呈现为单独的视图(在同一页面上)

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多