我尝试将动态结果传递给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>
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);
答案 0 :(得分:4)
匿名对象与dynamic
不同。如果您想像dynamic
一样使用它,那么将其转换为:
@foreach (dynamic m in Model)
然而,如果可能的话,最好避免动态。您将失去所有编译时检查甚至智能感知。你不知道你是否在运行时之前尝试了一个属性名称,或者即使你在运行时错误地使用了错误的类型的东西。如果某些内容被破坏,您希望在编译时了解它,而不是在它已经存在且影响用户的情况下,当您甚至不知道发生错误时,除非用户通知您。对于您的应用来说,这是一个可怕的情况。
长短,使用强大的类型。如果您想要包含属性ColorID
和ColorName
的内容,请创建包含这些属性的视图模型,然后在该类型的实例中选择查询。然后,如果您的代码出现错误或问题,那么一切都会很好并且类型很强,并且您会提前知道。