【问题标题】:ASP.Net Create Two Models With One ControllerASP.Net 使用一个控制器创建两个模型
【发布时间】:2015-11-02 21:39:55
【问题描述】:

我只是想创建一个适用于两种模型的控制器。 评论模型:

 public class Comment
 {
    public int ID { get; set; } // property
    public int PostID { get; set; }
    public String Title { get; set; }
    public String Name { get; set; }
    public Uri Url { get; set; }
    public String Text { get; set; }
    public Post Post { get; set; }
}

public class CommentDBContext : DbContext 
{
    public DbSet<Comment> Comments { get; set; }

    public System.Data.Entity.DbSet<BlogShauli.Models.Post> Posts { get; set; }

}

后模型:

  public class Post
  {
    public int ID { get; set; } // property
    public String Title { get; set; }
    public String Author { get; set; }
    public String AuthorSite { get; set; }
    public DateTime ReleaseDate { get; set; }
    public String Text { get; set; }
 }

public class PostDBContext : DbContext
{
    public DbSet<Post> Posts { get; set; }
}

现在我想创建一个适用于两种模型的单一控制器。 我读到这样做的方法是使用 ViewModel 模式,所以我创建了一个名为“BlogViewModel.cs”的模型类,代码如下:

public class MotorcycleViewModel
 {
     public Comment CommentPointer { get; set; }
     public Post PostPointer { get; set; }
 }

但是从这里我不明白做什么。我正在尝试使用实体框架创建一个新的控制器,但我不知道在 “数据上下文类” 中选择什么。有人能解释一下如何在两个模型和控制器之间建立连接吗?谢谢!

【问题讨论】:

  • 您走在正确的道路上。在 Controller 中使用 MotorcycleViewModel。您可以通过 VS 模板使用这种类型简单地生成一个 CRUD 控制器,并查看它是如何被使用的。
  • 拆分 DbContext 有什么原因吗?如果 PostsComments 都是同一个 DbContext 的一部分,则无需选择。如果我有大量实体,我可能会决定拆分,但您需要小心地将相关实体组合在一起,以免遇到此问题。
  • 我必须将它拆分为 2 个数据库.. Kanchirk,我无法理解控制器将是哪种类型,因为我创建它时我需要选择“日期上下文类”并且我有两个- 在两种型号中..
  • ViewModels 不是实体,也不是DbContext 的成员。
  • @TomerAro 您想在视图中显示什么,您的视图模型将取决于您的视图要求。

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


【解决方案1】:

请在您的存储库类中尝试以下操作 -

public MotorcycleViewModel GetModelData(int commentId, int postId)
{
    MotorcycleViewModel result =new MotorcycleViewModel();
    using (var context = new CommentDBContext())
    {
       var post = (from pst in context.Post where pst.ID == postId  select pst).FirstOrDefault();
       var comment = (from cmt in context.Comment where cmt.ID == commentId select cmt).FirstOrDefault();
       result.CommentPointer = comment;
       result.PostPointer = post;
       return result;
    }
}

请关注link 了解模型到视图模型的转换是如何发生的,反之亦然

【讨论】:

    【解决方案2】:

    您只需要一个控制器:Post。

    由于评论与帖子相关,因此您可以创建关系并使用 EF 映射它。因此,您的帖子将有 cmets 列表,可以根据您的选择急切或懒惰地检索。所以谷歌 EF 一对多关系,在你的帖子中创建一个虚拟属性,它是一个 IEnumerable 并从任何模型返回它。

    除非我在这里遗漏了什么,否则您不需要 ViewModel... 至少不需要解决这个问题。 ViewModel 在与组织有关时很有用。

    【讨论】:

      【解决方案3】:

      你也可以这样做

      @model MotorcycleViewModel
      

      @Html.DisplayNameFor(x=&gt;x.CommentPointer.Title) @Html.DisplayFor(x=&gt;x.CommentPointer.Title)

      @Html.DisplayNameFor(x=&gt;x.PostPointer.Title) @Html.DisplayFor(x=&gt;x.PostPointer.Title)

      但是,此代码可帮助您显示两个表中的数据.. 此外,@TomerAro 我建议您使用一个上下文,因为多个上下文可能会导致混淆

      【讨论】:

        【解决方案4】:

        在这种情况下,您不需要在视图中传递两个模型。您可以简单地传递 Comment 模型。但是,您可以使用 Tuple 在使用 Tuple 的 CRUD 操作的 view.Here is a great example 中传递多个模型

        【讨论】:

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