我正在尝试重构视图和模型。以前,强类型视图在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。
答案 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
因此,从这些中提取,您需要引入一个带有协变泛型类型参数的接口:
答案 1 :(得分:0)
视图实际上并不使用泛型类的成员,只是泛型类。我让它作为MyViewModel工作。该视图仅使用MyViewModel属性,仅使IMySubViewModel可用于JavaScript(我们基本上将其内容转储到Knockout模板中)。
如果在这种情况下使用Generics没有优势,那么我怀疑你可以轻松地将其作为替代方案:
public MyViewModel
{
public Object KoTempModels { get; set; }
}
只需使用您需要的模型填充KoTempModels
属性。