【问题标题】:Using a Model Class of Type T or Interface for Strongly Typed View为强类型视图使用 T 类型的模型类或接口
【发布时间】:2016-09-22 17:49:54
【问题描述】:

我正在尝试重构视图和模型。以前,强类型视图在 CSHTML 文件中有这个模型指令:

@model MyViewModel<MySubViewModel>

我已经确定类型 MySubViewModel 需要是通用的或可继承的,因为我已经确定了多种应该可以在这里互换的类型。

首先我尝试了这个:

@model MyViewModel<T>

...我做不到,所以,一厢情愿,我尝试了这个:

@model MyViewModel<T> where T : IMySubViewModel

...这也不好,所以我终于尝试了这个:

@model MyViewModel<IMySubViewModel>

...起初我认为这是有效的,因为 Visual Studio 没有强调它。但是,我很快看到我插入 Razor 的每个地方都显示为错误消息“当前上下文中不存在名称 'Whatever'”。这适用于 ViewBag、Html 助手和我的视图模型的所有用法。

那么这应该怎么做呢?还是不能做?我意识到我可能会使用:

@model MyViewModel<dynamic>

...但我宁愿不要失去 Intellisense,因为我知道“动态”类型将始终是实现 IMySubViewModel 的东西。

【问题讨论】:

  • MyViewModel 和 IMySubViewModel 来自哪些命名空间?
  • 我很惊讶@model MyViewModel&lt;IMySubViewModel&gt; 没用。我假设MyViewModel 被定义为泛型类型,并且没有限制可以防止接口IMySubViewModel 用作泛型类型参数的类型?
  • @Jakotheshadows - 它们位于特定于解决方案的命名空间中,但类型无法识别似乎没有问题。
  • @bubbleking 看看这是否有帮助:stackoverflow.com/questions/29319189/…?您在回答中没有提到任何关于尝试过组件缓存的内容,所以我会尝试一下以防万一。

标签: c# asp.net asp.net-mvc razor


【解决方案1】:

这个问题类似于这些问题:

Why can't my view's model bind with my generic ViewModel which implements an interface? (ASP.NET MVC 3) Pass subclass of generic model to razor view

因此,根据这些,您需要引入一个带有协变泛型类型参数的接口:

https://dotnetfiddle.net/WcIzrr

【讨论】:

    【解决方案2】:

    视图实际上并未使用泛型类型类的成员,仅使用泛型类。我让它作为 MyViewModel 工作。该视图仅使用 MyViewModel 属性,并且仅使 IMySubViewModel 可用于 JavaScript(我们基本上将其内容转储到 Knockout 模板中)。

    如果在这种情况下使用泛型没有优势,那么我怀疑您可以轻松地将其用作替代方案:

    public MyViewModel
    {
      public Object KoTempModels { get; set; }
    }
    

    只需使用您需要的模型填充KoTempModels 属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多