【问题标题】:MVC mismatch between controller output and View properties控制器输出和视图属性之间的 MVC 不匹配
【发布时间】:2012-02-29 17:47:47
【问题描述】:

我的 MVC4 应用中有一个非常简单的 EF (CodeFirst) 结构。

在我的控制器中,我有一个简单的查询:

var activity = db.Activities.Where(a => a.Engagement.Id == Id);

我的视图可以毫无问题地处理这个查询的结果。

但是,当我进行查询时,我需要将一个表加入到我的活动表中。这个查询对我有用:

var activity = from a in db.Activities
                       join m in db.Members on a.MemberID equals m.Id
                       where a.Engagement.Id == Id
                       select new
                       {
                           a.Description,
                           a.ActivityDate,
                           a.EngagementStageValue,
                           a.Hours,
                           m.Email,
                       };

问题是视图无法解释查询的结果。我收到此错误:

"传入字典的模型项的类型为'System.Data.Entity.Infrastructure.DbQuery1[<>f__AnonymousType15[System.String,System.DateTime,System.Int32,System.Int32,System. String]]',但此字典需要类型为 'System.Collections.Generic.IEnumerable`1[DomainClasses.Activity]' 的模型项。"

我对 MVC 和 EF(讨厌的学习曲线)比较陌生,任何帮助都会很棒。
谢谢!

【问题讨论】:

    标签: asp.net-mvc-3 entity-framework


    【解决方案1】:

    定义一个具有您需要的属性的 ActivityModel 类:

    public class ActivityModel
    {
      public string Description {get; set;}
      public DateTime ActivityDate {get; set;}
      public yourtype EngagementStageValue {get; set;}
      public DateTime Hours {get; set;}
      public string Email {get; set;}
    
      //you can also add new properties to get a cleaner view for an example
      public string ActivityDateShort{ 
    
          get{
                return ActivityDate.ToShortDateString();
             }
    
    }
    
    var activity = (from a in db.Activities
                           join m in db.Members on a.MemberID equals m.Id
                           where a.Engagement.Id == Id
                           select new ActivityModel
                           {
                              Description = a.Description,
                              ActivityDate = a.ActivityDate,
                              EngagementStageValue = a.EngagementStageValue,
                              Hours = a.Hours,
                              Email = m.Email,
                           }).ToList();
    

    因此您将获得一个列表并将其作为模型传递给您的视图,并使用它做您喜欢的事情。问候

    【讨论】:

      【解决方案2】:

      这是因为您正在生成一个匿名类型并且该视图是强类型的。基本上,当您添加“电子邮件”字段时,您已经创建了一个新类型,而视图不知道如何处理它。

      【讨论】:

      • 谢谢,我明白了。有解决办法吗?如何修改视图以适应附加属性?
      • 通常我会创建一个 ViewModel 来添加额外的字段。在您的情况下,它将最终成为 ViewModel 的集合。不过可能有更聪明的方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-16
      • 2018-08-29
      • 2014-04-10
      • 1970-01-01
      相关资源
      最近更新 更多