是否有可能在ASP.NET MVC 3(w/Razor)中使用通用模型?以下语法错误会失败:在ASP.NET MVC中使用通用模型Razor
@model DtoViewModel<T> where T : IDto
是否有可能在ASP.NET MVC 3(w/Razor)中使用通用模型?以下语法错误会失败:在ASP.NET MVC中使用通用模型Razor
@model DtoViewModel<T> where T : IDto
Razor不支持此类语法,对不起。
因为@model期待一个类型 - 不是一个类型声明 你可以使用:
@model DtoViewModel<IDto>
,并要在为了使用泛型类型采取通用的协方差
假设的优势为了避免在ViewModel<T>
每个视图代码复制,你可以这样来做:
创造的ViewModel<T>
特有的部分景色到视图
ModelView.cshtml:
@model ViewModel<specificType>
@{Layout = "~/Views/Shared/Layout.cshtml";}
<h2 class="sub-header">Specific type view</h2>
2.创建公用部分的视图,即应当在<T>
每个视图
Grid.cshtml被渲染:
@{ var webGrid = new WebGrid(Model.PageItems); }
<div class="row" style="overflow: auto">
@webGrid.GetHtml("table-striped", mode: WebGridPagerModes.All, firstText: "First", lastText: "Last")
</div>
由于是局部视图,因此不需要再次声明Model
的类型。它将简单地使用您在父视图中定义的模型来呈现它。您的模型的属性IList<T> PageItems
将保持与<specificType>
的强类型。
。不要忘记真正使您的公用部分
ModelView.cshtml的局部视图:
@RenderPage("~/Views/Shared/Grid.cshtml")
这是不理想,但它的工作原理,并能得到这种模式相当有创造性。
@model YourNameSpace.MyModel
public MyModel
{
public MyGenericType<string> ModelAStuff {get;set;}
public MyGenericType<int> ModelBStuff {get;set;}
public MyGenericType<DateTime> ModelCStuff {get;set;}
}
public class MyGenericType<T>
{
//use T how ever you like
public T Color {get;set;}
public T Year {get;set;}
}
无赖。我很乐意在未来看到它的支持,但我没有看到任何其他人抱怨,所以我怀疑它会获得任何形式的牵引力。感谢您的回答。 – egoodberry 2011-04-21 12:41:41
我想要这个!所以这是抱怨或至少是另一个人的要求。 – 2011-06-28 16:17:56
哇。说实话,这很令人震惊。 – fearofawhackplanet 2011-09-14 15:27:44