我有一个Contact
对象的列表,我只想要其中的一个子集属性。因此,我使用LINQ投影创建了一个匿名列表,并将其传递给部分视图。但当我在部分视图中使用该列表时,编译器会说它并没有那个些属性。我尝试了如下最简单的情况,但仍然没有机会在局部视图中使用匿名对象或列表。
var model = new { FirstName = "Saeed", LastName = "Neamati" };
return PartialView(model);
在局部视图中,我有:
<h1>Your name is @Model.FirstName @Model.LastName<h1>
但它说@Model没有FirstName和LastName属性。这里怎么了?当我使用@Model时,这个字符串将在浏览器中呈现:
{ Title = "Saeed" }
不要这样做。不要将匿名对象传递到视图中。它们的属性是内部的,在其他程序集中不可见。视图由ASP.NET运行时动态编译为单独的动态程序集。因此,定义视图模型并强烈键入视图。像这样:
public class PersonViewModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
然后:
var model = new PersonViewModel
{
FirstName = "Saeed",
LastName = "Neamati"
};
return PartialView(model);
在您看来:
@model PersonViewModel
<h1>Your name is @Model.FirstName @Model.LastName<h1>
使用反射来获取值,性能稍慢,但无需创建不必要的模型
将下一个类添加到您的应用程序
public class ReflectionTools
{
public static object GetValue(object o, string propName)
{
return o.GetType().GetProperty(propName).GetValue(o, null);
}
}
在您的视图中使用下一个代码
@(WebUI.Tools.ReflectionTools.GetValue(Model, "Count"))
希望对有所帮助