在MVC5 Razor View中传递动态模型

sai*_*fan 6 asp.net-mvc view dynamic razor asp.net-mvc-5

我正在尝试将动态结果传递给View from Controller,方法ShowColor返回动态结果.在视图中我尝试循环收集,但我收到错误

'object'不包含'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());
}
Run Code Online (Sandbox Code Playgroud)

视图

@model dynamic

@{
    ViewBag.Title = "DBDynamic";
}

<h2>DBDynamic</h2>

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

</p>
Run Code Online (Sandbox Code Playgroud)

错误

调试图像

找到了解决办法 在这里和一个不错的博客在这里:

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;
}
Run Code Online (Sandbox Code Playgroud)

并称之为这样

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

return View(select);
Run Code Online (Sandbox Code Playgroud)

Chr*_*att 6

匿名对象与dynamic. 如果您想像 a 一样使用它,dynamic则将其转换为:

@foreach (dynamic m in Model)
Run Code Online (Sandbox Code Playgroud)

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

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