【问题标题】:ASP.NET MVC 3 - Create a dynamic object only for returnASP.NET MVC 3 - 创建仅用于返回的动态对象
【发布时间】:2012-03-21 08:21:42
【问题描述】:

我有一个 javascript 应用程序(后端带有 SignalR 的 ASP.net MVC 3),我只想返回需要的字段(它必须是动态的)。

我使用实体框架,但我不能只选择特定的列,因为我需要一些用于检查的字段或客户端不需要的方法中的某些内容。

所以,目前我做这个:

    public void GetPerson(int personID)
    {
        // Some logic...

        // person is a entity from the entity framework (Person)
        dynamic p = new
        {
            ID = person.ID,
            FirstName = person.FirstName,
            LastName = person.LastName
        };

        Clients[Context.ConnectionId].loadPerson(p);
    }

但我不确定它是否是一种好的做法(性能等)。有没有更好的解决方案或者我还能继续使用动态类型吗?

【问题讨论】:

  • 我不明白你的例子。你创建了 p,但不使用它?
  • 这样就好了(假设你在某个时候返回 p)。我只是想知道您节省的带宽是否真的那么多。如果您要返回许多对象,或者您的流量很大,这可能是值得的,但如果这些都不是,那么可能没有必要。
  • @Mystere Man,我编辑它。我返回 p。
  • @mjmarsh,是的,我必须返回 30'000 个动态对象

标签: c# javascript asp.net-mvc


【解决方案1】:

你在使用ExpandoObject吗?

按照您的示例,可能只使用匿名类型而不是动态类型。

 var p = new
        {
            ID = person.ID,
            FirstName = person.FirstName,
            LastName = person.LastName
        };

这将确保您仍然获得编译时检查。但是,任何一个都应该工作。有关匿名与动态的更多详细信息,请参阅this

【讨论】:

    【解决方案2】:

    我觉得不错。如果您需要其他列,则返回它们并执行您需要对它们执行的操作,然后在您执行操作时创建一个匿名人员并将其传入。

    【讨论】:

      【解决方案3】:

      无论是通过 JSON 将数据返回到视图还是客户端,甚至使用 SignalR,MVC 的最佳实践都是使用强类型对象。只需专门为要返回的数据创建一个 ViewModel 并使用它。我通常使用 [Controller][Action]ViewModel 的约定来命名这些类。所以一个可能是MemberDetailsViewModel

      好处包括编译时检查、更容易的序列化以及以后修改时出现的问题更少。

      当我第一次开始使用 MVC 时,我完全尝试了你所做的事情。相信我,你认为现在得到的便利不值得。

      如果返回的数据必须是动态的,您可能需要尝试返回键值对的集合。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-07
        • 1970-01-01
        • 2013-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-12
        • 1970-01-01
        相关资源
        最近更新 更多