对强类型视图使用类型T或接口的模型类

时间:2016-09-22 17:49:55

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

我正在尝试重构视图和模型。以前,强类型视图在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。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

  

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

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

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

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