将匿名类型绑定到.NET MVC 5中的View

时间:2017-04-24 12:43:47

标签: c# asp.net asp.net-mvc razor asp.net-mvc-5

我有一个我写的代码,如下所示:

    ViewBag.Items = user.Items.GroupBy(x => x.ItemId).Select(pr => new
            {
                ItemId = pr.Key,
                ImageURL = pr.Select(x=>x.ImageURL).FirstOrDefault(),
                Title = pr.Select(x=>x.Title).FirstOrDefault(),
                Sales = pr.Select(x=>x.Transactions.Sum(y=>y.QuantitySold))

            }).ToList();

你可以看到它是一个匿名对象列表......我现在要做的是将这些值绑定到我已经存在的视图中,如下所示:

     <tbody>
                @if (ViewBag.Items != null)
                {
                    foreach (var item in ViewBag.Items)
                    {
                        <tr>
                            <td><img src="@item.ImageURL" /></td>
                            <td>@item.Title</td>
                            <td>@item.Sales</td>
                        </tr>
                    }
                }
            </tbody>

但是我收到了这个错误:

Additional information: 'object' does not contain a definition for 'ImageURL'

还有其他属性......

我如何解决这个问题,但同时避免创建额外的类,这会使视图强烈输入类型。有人可以帮助我吗?

2 个答案:

答案 0 :(得分:3)

因为public class ViewModel { public int ItemId {get;set;} ... ... ... } 是动态类型并使用它我们失去了comiple时间安全性和智能感知,你可以创建一个ViewModel并使用它:

var model = user.Items.GroupBy(x => x.ItemId).Select(pr => new
        ViewModel {
                ItemId = pr.Key,
                ImageURL = pr.Select(x=>x.ImageURL).FirstOrDefault(),
                Title = pr.Select(x=>x.Title).FirstOrDefault(),
                Sales = pr.Select(x=>x.Transactions.Sum(y=>y.QuantitySold))

        }).ToList();

return View(model);

然后在该viewmodel上投影:

@model List<YourNamespace.ViewModels.ViewModel>
@if (@Model!= null)
{
     foreach (var item in @Model)
     {
         <tr>
            <td><img src="@item.ImageURL" /></td>
            <td>@item.Title</td>
            <td>@item.Sales</td>
         </tr>
     }
}

现在在您的视图中将您的视图绑定到该模型,如:

github

答案 1 :(得分:0)

将其投射到目标类型

{{1}}