Можно ли использовать общую модель в ASP.NET MVC 3 (w/Razor)? Ниже приведена ошибка с синтаксической ошибкой:
@model DtoViewModel<T> where T : IDto
Можно ли использовать общую модель в ASP.NET MVC 3 (w/Razor)? Ниже приведена ошибка с синтаксической ошибкой:
@model DtoViewModel<T> where T : IDto
Такой синтаксис не поддерживается Razor, извините.
учитывая, что @model ожидает тип - не объявление типа вы можете использовать:
@model DtoViewModel<IDto>
и воспользоваться общей ковариацией
Предполагая, что вы хотите использовать общий тип, чтобы избежать дублирования кода в каждом представлении ViewModel<T>
, вы можете сделать это следующим образом:
1. создать представление для частей 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>
.
3. Не забудьте сделать частичный вид ваших общих частей
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;}
}