传递对象以查看错误

时间:2011-08-31 19:34:20

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

尝试将对象传递给视图时出现此错误。我是MVC的新手所以请原谅我。 传递到字典中的模型项的类型为'System.Collections.Generic.List 1[<>f__AnonymousType1 3 [System.Int32,System.String,System.Nullable 1[System.DateTime]]]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable 1 [MvcApplication1.Models.storageProperty]'

我正在尝试传递一个表的列表,该表将显示来自storageProperty表的对象,其中包含费用表中的最后一个日期(如果有的话)。大多数房产至少有一次费用审计,有些已经有很多,有些则没有。 以下是控制器的代码:

var viewModel = db.storageProperties.Select(s => new
        {
            s.storagePropertyId,
            s.BuildName,
            latestExpenseSurvey = (DateTime?)s.expenses.Max(e => e.expenseDate)
        }).ToList();
        return View(viewModel); 

         }

并且视图中的@model语句调用storageproperty对象。我在实体框架中使用mvc3。很明显,我无法传递此列表对象来代替storageproperty对象,但我无法弄清楚要做什么,我应该怎么做?

提前致谢。

2 个答案:

答案 0 :(得分:1)

永远不要将匿名对象传递给视图。您应该始终传递视图模型。

因此,与ASP.NET MVC应用程序一样,您首先要定义一个反映视图要求的视图模型:

public class MyViewModel
{
    public int StoragePropertyId { get; set; }
    public string BuildName { get; set; }
    public DateTime? latestExpenseSurvey { get; set; }
}

然后在您的控制器中返回IEnumerable<MyViewModel>

public ActionResult Index()
{
    var viewModel = db.storageProperties.Select(s => new MyViewModel
    {
        StoragePropertyId = s.storagePropertyId,
        BuildName = s.BuildName,
        LatestExpenseSurvey = (DateTime?)s.expenses.Max(e => e.expenseDate)
    }).ToList();
    return View(viewModel); 
}

最后强烈地将视图输入到此视图模型的集合中:

@model IEnumerable<MyViewModel>
<div>
    @Html.EditorForModel()
</div>

答案 1 :(得分:0)

您的Linq查询项目为匿名类型。您需要为此投影创建命名类型,以便从视图中引用它。