Подтвердить что ты не робот

Использование общей модели в ASP.NET MVC Razor

Можно ли использовать общую модель в ASP.NET MVC 3 (w/Razor)? Ниже приведена ошибка с синтаксической ошибкой:

@model DtoViewModel<T> where T : IDto
4b9b3361

Ответ 1

Такой синтаксис не поддерживается Razor, извините.

Ответ 2

учитывая, что @model ожидает тип - не объявление типа вы можете использовать:

@model DtoViewModel<IDto>

и воспользоваться общей ковариацией

Ответ 3

Предполагая, что вы хотите использовать общий тип, чтобы избежать дублирования кода в каждом представлении 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")

Ответ 4

Это не идеально, но он работает и может стать довольно творческим с этим шаблоном.

@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;}
}