【问题标题】:How to use anonymous list as model in an ASP.NET MVC partial view?如何在 ASP.NET MVC 局部视图中使用匿名列表作为模型?
【发布时间】:2011-09-27 09:21:48
【问题描述】:

我有一个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" }

【问题讨论】:

  • 您遇到了匿名类型经常哀叹和讨论的主题,它们的属性声明为内部,这导致了您的场景。此链接提供了一个可行的解决方案。 stackoverflow.com/questions/5120317/…。但是,您最好有一个具体的类型用于您的视图模型,但这是一个选项。
  • 这里几乎有同样的问题。答案与 Khepri stackoverflow.com/questions/4862122/…
  • 使用@model dynamic

标签: asp.net-mvc asp.net-mvc-3 viewmodel anonymous-types partialviews


【解决方案1】:

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

【讨论】:

  • 在最新版本的 MVC 中是否仍然如此 - 即匿名对象是内部的并且不可见?
  • @model dynamic 呢?
  • @Darin 每个视图(cshtml)都有自己的程序集吗?
【解决方案2】:

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

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

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

希望有帮助

【讨论】:

  • 使用反射来解决这个问题是一个可怕的解决方案。这是昂贵且不必要的,并且会导致更多问题。
  • 这是 100% 有效的解决方案,它回答了如何使用匿名对象,我想听听您如何以正确的方式使用它?
猜你喜欢
  • 2021-07-16
  • 2013-06-21
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 2010-11-09
相关资源
最近更新 更多