Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何在ASP.NET MVC局部视图中使用匿名列表作为模型?_Asp.net Mvc_Asp.net Mvc 3_Viewmodel_Anonymous Types_Partialviews - Fatal编程技术网

Asp.net mvc 如何在ASP.NET MVC局部视图中使用匿名列表作为模型?

Asp.net mvc 如何在ASP.NET MVC局部视图中使用匿名列表作为模型?,asp.net-mvc,asp.net-mvc-3,viewmodel,anonymous-types,partialviews,Asp.net Mvc,Asp.net Mvc 3,Viewmodel,Anonymous Types,Partialviews,我有一个Contact对象列表,从中我只需要属性的子集。所以我使用LINQ投影来创建一个匿名列表,并将其传递给一个局部视图。但当我在部分视图中使用该列表时,编译器说它并没有这些属性。我尝试了以下最简单的情况,但仍然没有机会在局部视图中使用匿名对象或列表 var model = new { FirstName = "Saeed", LastName = "Neamati" }; return PartialView(model); 在局部视图中,我有: <h1>Your name i

我有一个
Contact
对象列表,从中我只需要属性的子集。所以我使用LINQ投影来创建一个匿名列表,并将其传递给一个局部视图。但当我在部分视图中使用该列表时,编译器说它并没有这些属性。我尝试了以下最简单的情况,但仍然没有机会在局部视图中使用匿名对象或列表

var model = new { FirstName = "Saeed", LastName = "Neamati" };
return PartialView(model);
在局部视图中,我有:

<h1>Your name is @Model.FirstName @Model.LastName<h1>

不要这样做。不要将匿名对象传递给视图。它们的属性是内部的,在其他程序集中不可见。视图由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>
@model PersonViewModel
您的名字是@Model.FirstName@Model.LastName

使用反射获取值,性能稍慢,但无需创建不必要的模型

将下一个类添加到应用程序中

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"))

希望这对您有所帮助

您遇到了经常抱怨和讨论的主题,即匿名类型的属性声明为内部,这导致了您的场景。此链接提供了一个可行的解决方案。不过,您最好有一个用于视图模型的具体类型,但这是一个选项。与Khepri使用
@model dynamic
相同的答案使用反射来解决这个问题是一个可怕的解决方案。这是一个100%可行的解决方案,它回答了如何使用匿名对象,我想听听您如何以正确的方式使用它?在最新版本的MVC中仍然是这样吗?即匿名对象是内部的且不可见的?关于
@model dynamic
?@Darin每个视图(cshtml)都有自己的程序集吗?
            @(WebUI.Tools.ReflectionTools.GetValue(Model, "Count"))