CodeProject QA 部分中最近的一个问题涉及在给定的 ASP.NET (MVC) 视图中使用多个模型。您可能知道,您只能在视图中指定一个模型,但有时您可能需要在任何给定时间访问多个模型。

我的解决方案是创建一个包含 type 对象列表的“模型包” object,并将该模型包用作视图中的唯一模型,从而遵守 Microsoft 施加的任意限制。请记住,这并不意味着您不能在其他环境中使用此代码,它只是解释了最初开发代码的原因。

本文描述了我自己的模型包实现,代码在 .NET Standard 2.0 程序集中,这使得它同时兼容 .NET Core (3.0+) 和 .NET Framework。这纯粹是为了演示两种环境中的代码。将有问题的程序集重新定位为仅针对您的首选环境将是一件简单的事情。

政治/宗教观点- 就我个人而言,我认为使用 .NET Core 没有任何实际价值 - 所以在这段代码中对 Core 的支持只是试图阻止不可避免的触发抱怨。请不要将此声明解释为讨论该主题的邀请。我不会理解,会特别不友善。你已经被警告过了。

未来雇主须知- 上面的政治/宗教声明并不意味着我不会在公司代码上使用 .NET Core。这只是我公认的狭隘世界观。例如,我不是 Web 开发的粉丝,但我目前有一份工作要做。这就是生活。

编码

该代码使用以下 .NET 功能:

  • 控制台应用程序 - 用于演示代码
  • 库程序集
  • 收藏品
  • 反射
  • 泛型
  • 林克

项目

演示解决方案中包含以下项目:

  • PWMultiModelBag - 面向 .NET Standard 2.0 的类库。包含这篇文章用来描述的代码
     
  • DemoNetCore - 面向 .NET Core 5.0 的控制台应用程序,练习 PWMultiModelBag 程序集。
     
  • DemoNetFrame - 面向 .NET Framework 4.7.2 的控制台应用程序,练习 PWMultiModelBag 程序集。
     
  • SampleObjects - 面向 .NET Standard 2.0 的类库,包含用于练习 PWMultiModelBag 程序集的示例类。
     

PWMultiModelBag 组件

这是您将在自己的代码中引用的程序集。它只包含一个类 - MultiModelBag. 它是一个相当简单的类,具有向其内部集合添加对象、检索这些对象以供您的代码使用以及从内部集合中删除这些对象的方法。这是该类的所有 JSOP 优点。


C#



该对象使用泛型允许程序员添加/获取/删除任何类型的对象。它旨在用于复杂对象,而不是内在函数(毕竟,我们在这里谈论的是“模型”),但我认为内在函数也可以使用。为了充分披露,我没有用内在对象对其进行测试。

反射用于(查找使用 的方法PropertyInfo)来查找具有指定名称和值的对象以进行检索或删除。

实例化

当你实例化这个对象时,你可以指定可以将多个相同类型的对象添加到包中。如果允许重复,则无法防止添加在用于标识对象的属性值方面相同的对象。allowDupes 参数的默认值为false

添加对象

调用该MultiModelBag.Add方法将执行以下功能:




如果指定的对象不为空
{
    在集合中找到对象类型的第一项
    如果允许重复,或者没有找到项目
    {
        将对象添加到集合中
    }
}

此方法返回 1(如果添加了对象)或 0(如果未添加对象)。

移除对象

移除对象从集合中移除指定类型的对象,并将移除的对象返回给调用方法。这很方便,因为您可以 a) 验证是否删除了正确的对象,并且 b) 在放开该对象范围之前对该对象进行进一步处理。当然,您也可以完全忽略返回值。

MultiModelBag.Remove 方法有两个重载。

  • public T Remove<t>()- 此重载删除它找到的第一个指定类型的对象。
     
  • public T Remove<t>(string propertyName, object value)- 此重载接受属性名称和值,并在集合中搜索具有指定属性值的指定类型的第一个对象,如果找到则将其删除。

移除对象不受该AllowDuplicates标志的影响。

检索对象

检索对象将搜索指定对象并将其返回给调用方法。有两个重载:

  • public T Get<t>()- 此重载查找并检索它找到的指定类型的第一个对象。如果找不到指定类型的对象,则返回null.
     
  • public T Get<t>(string propertyName, object value)- 此重载接受属性名称和值,并在集合中搜索具有指定属性值的指定类型的第一个对象,并返回该对象(如果未找到,则返回 null)。

SampleObjects 程序集

该程序集提供了两个控制台应用程序使用的示例数据,并且仅用于减少演示代码占用空间。鉴于大会的性质,不包括任何评论。


C#