在MVC5 Razor View中传递动态模型

时间:2014-12-08 17:42:27

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

我尝试将动态结果传递给View from Controller,方法ShowColor会返回动态结果。在视图中,我尝试遍历集合,但我收到错误

  

'对象'不包含' ColorID'。

的定义

我在Controller和View中有以下代码

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>

Error

Debug Image

找到解决方案 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);

1 个答案:

答案 0 :(得分:4)

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

@foreach (dynamic m in Model)

然而,如果可能的话,最好避免动态。您将失去所有编译时检查甚至智能感知。你不知道你是否在运行时之前尝试了一个属性名称,或者即使你在运行时错误地使用了错误的类型的东西。如果某些内容被破坏,您希望在编译时了解它,而不是在它已经存在且影响用户的情况下,当您甚至不知道发生错误时,除非用户通知您。对于您的应用来说,这是一个可怕的情况。

长短,使用强大的类型。如果您想要包含属性ColorIDColorName的内容,请创建包含这些属性的视图模型,然后在该类型的实例中选择查询。然后,如果您的代码出现错误或问题,那么一切都会很好并且类型很强,并且您会提前知道。