【问题标题】:passing dynamic model in MVC5 Razor View [duplicate]在 MVC5 Razor 视图中传递动态模型 [重复]
【发布时间】:2015-02-06 10:42:14
【问题描述】:

我正在尝试将动态结果从 Controller 传递给 View,方法 ShowColor 返回动态结果。在视图中,我尝试遍历集合,但出现错误

“object”不包含“ColorID”的定义。

我在控制器和视图中有以下代码

public class myColor
{
    public int ID { get; set; }
    public string  Name { get; set; }
    public string Like { get; set; }
}

public dynamic ShowColor()
{
    IList<myColor> color = new List<myColor>();
    color.Add(new myColor { ID = 1, Name = "Red", Like = "***" });
    color.Add(new myColor { ID = 2, Name = "Green", Like = "*****" });
    color.Add(new myColor { ID = 3, Name = "Blue", Like = "**" });
    color.Add(new myColor { ID = 4, Name = "Yellow", Like = "*" });

    var select = (from c in color
                  select new
                  {                     
                      ColorID = c.ID,
                      ColorName = c.Name
                  }).ToList();

    return select;
}
public ActionResult DBDynamic()
{
    return View(ShowColor());
}

查看

@model dynamic

@{
    ViewBag.Title = "DBDynamic";
}

<h2>DBDynamic</h2>

<p>
    <ul>
        @foreach (var m in Model)
        {
            <li> @m.ColorID</li>            
        }
    </ul>

</p>

找到了解决方案here 和一个不错的博客here

public static ExpandoObject ToExpando(this object anonymousObject)
{
    IDictionary<string, object> expando = new ExpandoObject();
    foreach (PropertyDescriptor propertyDescriptor in TypeDescriptor.GetProperties(anonymousObject))
    {
        var obj = propertyDescriptor.GetValue(anonymousObject);
        expando.Add(propertyDescriptor.Name, obj);
    }

    return (ExpandoObject)expando;
}

然后这样称呼它

    var select = (from c in color
                select new
                {
                    ColorID = c.ID,
                    ColorName = c.Name
                })
                .AsEnumerable()
                .Select(x => x.ToExpando());

return View(select);

【问题讨论】:

  • 在您的剃刀视图中放置一个断点,看看您的结果是什么。
  • 我在帖子底部添加了一个调试图像。
  • 这个问题你解决了吗?刚遇到类似的问题,看看有没有思路。
  • 我终于解决了我的问题,但我们的场景之间的区别是你在一些 Linq Express 中使用匿名类,而我使用 JSON 对象
  • 是的,我也达到了相同的解决方案,我认为最好的方法是避免在模型中使用动态类型而不是使用 ViewModel,但在某些情况下 JSON 结果可能很有用。

标签: asp.net-mvc razor dynamic view asp.net-mvc-5


【解决方案1】:

匿名对象与dynamic 不同。如果您想像 dynamic 一样使用它,那么将其转换为:

@foreach (dynamic m in Model)

但是,如果可能的话,最好避免动态。你失去了所有编译时检查甚至智能感知。在运行时之前,您不会知道您是否对属性名称进行了粗略的处理,或者即使您在运行时之前不小心以错误的方式使用了错误类型的东西。如果有东西坏了,你想在编译时知道它,而不是当它已经存在并影响用户时,除非用户通知你,否则你甚至可能不知道发生了错误。对于您的应用来说,这是一种可怕的情况。

长短,使用强类型。如果你想要一些带有属性的东西,ColorIDColorName,创建一个具有这些属性的视图模型,然后选择你的查询到该类型的实例中。然后,一切都会很好并且是强类型的,如果您的代码有错误或问题,您会提前知道。

【讨论】:

  • 得到同样的错误信息。
  • 也许问题在于您的模型本身是动态的。将其更改为 List&lt;object&gt;IEnumerable&lt;object&gt; 看看会发生什么。
  • IEnumerable, List 不起作用,同样的错误报告
  • “最好避免动态”是不正确的。当您使用动态时,您希望在运行时使用变量,因此不需要编译时检查。您想即时创建对象。如果您想多次使用它们,您可以创建强类型。最好用动态来模拟 Javascript 行为,有时这可能很好。
  • @HermanVanDerBlom:动态确实更容易,但与生活中的大多数事情一样,这种轻松是一种权衡。在这里,您正在为您的应用程序中的错误引入一个潜在的向量。如果你正在做类似ViewBag.Title = "Foo" 的事情,你不太可能把它搞砸,所以你可能没问题。然而,你越复杂,就越有可能出现问题。运行时错误是成功应用的祸根。
猜你喜欢
  • 1970-01-01
  • 2019-01-12
  • 2017-09-02
  • 2016-05-30
  • 2020-04-24
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
  • 2016-08-30
相关资源
最近更新 更多