【问题标题】:Binding anonymous type to View in .NET MVC 5在 .NET MVC 5 中将匿名类型绑定到视图
【发布时间】:2017-04-24 12:43:47
【问题描述】:

我编写了一个代码,如下所示:

    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'

对于其他属性也是如此......

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

【问题讨论】:

  • 为此,您需要强制转换为动态foreach(dynamic item in...,但创建自定义类比使用匿名类要好得多。
  • 通过使用动态,您将依赖运行时类型检查而不是编译时间。强类型是 C# 的一大优点。
  • @User987 因为自定义类更易于使用,并且提供了您期望的属性存在的安全性。如果您需要更改内容,您可能会忘记在视图中进行更改。
  • 创建一个视图模型(但作为一个糟糕的选择,您可以使用dynamic - 参考this answer 或使用非类型化的HtmlHelper 方法 - 参考this answer
  • 如果您希望能够将此视图与多个具有相同属性集的类一起使用,则始终可以使用接口。

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


【解决方案1】:

这是因为ViewBag 是一种动态类型,使用它我们会失去编译时的安全性和智能感知,您可以创建一个 ViewModel 并使用它:

public class ViewModel
{
   public int ItemId {get;set;}
   ...
   ...
   ...
}

然后在该视图模型上进行投影:

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);

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

@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>
     }
}

【讨论】:

    【解决方案2】:

    只需将其转换为目标类型

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-12
      • 2013-12-10
      • 2012-03-25
      相关资源
      最近更新 更多