C# 当需要使用两种类型的强类型时,该怎么办

C# 当需要使用两种类型的强类型时,该怎么办,c#,asp.net-mvc,asp.net-mvc-3,model-view-controller,C#,Asp.net Mvc,Asp.net Mvc 3,Model View Controller,我是mvc的新手,我正在设计一些类似博客的web应用程序,我想从更多的经验中了解一件事。问题是我有一个博客文章的视图和一个输入评论的框。完美、抽象的解决方案是用一类文章和评论强烈地输入这个视图,但正如我们所知,这是不可能的。 处理这个案件的最佳方式是什么?因为它是文章的视图,所以应该使用article类键入它。另一方面,使用comment类键入它和使用ViewBag传递文章字段会更容易。我不认为它是正确的,因为从逻辑上讲,它不应该用一个类来类型化,这个类在这里没有直接表示(本文是主要的) 还有什

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

还有什么其他可能的解决方案可以轻松添加和验证评论,并以清晰的方式进行? 提前谢谢

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

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

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

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

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

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

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

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

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

使用新型号:

public class ArticleAndCommentsModel {
    public ArticleModel Article { get; set; }
    public IEnumerable<CommentModel> Comments { get; set; }
}
公共类文章和评论模型{
公共物品模型物品{get;set;}
公共IEnumerable注释{get;set;}
}
您的视图将继承
ViewPage

使用新模型:

public class ArticleAndCommentsModel {
    public ArticleModel Article { get; set; }
    public IEnumerable<CommentModel> Comments { get; set; }
}
公共类文章和评论模型{
公共物品模型物品{get;set;}
公共IEnumerable注释{get;set;}
}

您的视图将继承
ViewPage

您将在此实例中使用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; }
}
@model BlogPostViewModel

@* you can reference Model.Article, as well as Model.Comments here *@
下面是一个很好的工作示例

编辑:然后,对于接收发布数据的操作方法:

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

在此实例中,您将使用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; }
}
@model BlogPostViewModel

@* you can reference Model.Article, as well as Model.Comments here *@
下面是一个很好的工作示例

编辑:然后,对于接收发布数据的操作方法:

[HttpPost]
public ActionResult YourBlogView(BlogPostViewModel bpvm)
{
    // here you have access to the binded model
    // i.e. bpvm.Article
}
我可以看到两种选择

  • 使用文章和注释集合创建viewmodel
  • 将注释部分呈现为单独的视图(在同一页上)
  • 我可以看到两种选择

  • 使用文章和注释集合创建viewmodel
  • 将注释部分呈现为单独的视图(在同一页上)

  • 其他人建议的
    ViewModel
    方法的替代方法是将
    文章
    放在
    ViewBag
    中,并从那里引用它,让
    注释
    成为页面的模型。这假设用户不修改文章。

    其他人建议的
    视图模型
    方法的替代方法是将
    文章
    放在
    视图包
    中,从那里引用它,并让
    注释
    成为页面的模型。这假设用户不修改文章。

    为什么不使用一个包含post和comments类的BlogPost类呢?我认为合成是一个更好的解决方案,但是您可以继承多个接口而不是多个类。允许多接口继承。为什么不使用一个包含post和comments类的BlogPost类呢?我认为组合是一个更好的解决方案,但是您可以继承多个接口而不是多个类。允许多接口继承。好的,但我的问题(主要)是在同一视图中添加注释。在这种情况下,我可以在控制器端使用FormCollection来处理这个新的吗?@deha您可以使用输入(无论是直接DOM还是InputExtensions)将这个新数据(注释)传递给POST操作。您可以展示一些简单的代码示例吗?我主要对控制器方法参数感兴趣…@deha我已经编辑了我的帖子来展示简单的控制器操作方法。所以我猜BlogPostViewModel应该包含像NewComment这样的字符串字段,并在视图中为其呈现编辑器?好的,但我的问题(主要)是在同一视图中添加注释。在这种情况下,我可以在控制器端使用FormCollection来处理这个新的吗?@deha您可以使用输入(无论是直接DOM还是InputExtensions)将这个新数据(注释)传递给POST操作。您可以展示一些简单的代码示例吗?我主要对控制器方法参数感兴趣…@deha我编辑了我的帖子来展示简单的控制器操作方法。所以我猜BlogPostViewModel应该包含像NewComment这样的字符串字段,并在视图中为它呈现编辑器?