如何在Asp.Net MVC Razor中创建"通用"控件?

jjn*_*guy 9 c# generics razor asp.net-mvc-3

我正在尝试编写一个通用(在许多地方有用)控件,我可以在整个公司中重复使用.

我在视图和viewmodel中遇到了实际的C#泛型问题.

这是我正在尝试做的一个例子:

通用局部视图:( _Control.cshtml)

@model SimpleExample<dynamic> 

@Model.HtmlTemplate(Model.Data)
Run Code Online (Sandbox Code Playgroud)

ViewData :( SimpleExample.cs)

public class SimpleExample<T>
{
    public T Data;
    public Func<T, System.Web.WebPages.HelperResult> HtmlTemplate;
}
Run Code Online (Sandbox Code Playgroud)

用法示例:( FullView.cshtml)

@model Foo.MyViewData

@Html.Partial("_Control", new SimpleExample<MyViewData>
{
    Data = Model,
    HtmlTemplate = @<div>@item.SomeProperty</div>
})
Run Code Online (Sandbox Code Playgroud)

我正在寻找的功能的重要部分是消费者在编写Html内联时获得一个打字对象,这样他们就可以使用Intellisense(如FullView.cshtml).

一切都编译良好,智能感知正在工作,但我得到的错误是运行时:

The model item passed into the dictionary is of type 
'AnytimeHealth.Web.ViewData.SimpleExample`1[Foo.MyViewData]', 
but this dictionary requires a model item of type 
'AnytimeHealth.Web.ViewData.SimpleExample`1[System.Object]'.
Run Code Online (Sandbox Code Playgroud)

我已经读过,我可以在我的泛型类型上使用covarience来实现这一点,但我不知道该怎么做.

你能告诉我怎么能让这个工作吗?

Jar*_*van 5

更改定义_Control.cshtml

@model SimpleExample<dynamic>@model dynamic

它会工作,但会失去智能感知SimpleExample,智能感知MyViewData仍然有效。

我认为这是因为动态类型将在运行时已知,但泛型的类型

需要一个早期的时间(也许是编译时间),在那时,只有object被知道。