ASP.NET MVC PartialView универсальный ModelView - PullRequest
2 голосов
/ 27 мая 2010

У меня есть приложение ASP.NET MVC, в котором я хочу динамически выбирать частичное представление и какие данные передаются в него, сохраняя при этом строгие типы.

Итак, в основной форме я хочу классу него есть модель представления, которая содержит свойство общего типа, которое должно содержать данные для модели представления частичного представления.

public class MainViewModel<T>
{
    public T PartialViewsViewModel { get; set; }
}

В пользовательском элементе управления я хотел бы что-то вроде:

Inherits="System.Web.Mvc.ViewUserControl<MainViewModel<ParticularViewModel>>" %>

Хотя в моей родительской форме я должен поставить

Inherits="System.Web.Mvc.ViewPage<MainViewModel<ParticularViewModel>>" %>

, чтобы он заработал.

Есть ли способ обойти это?Вариант использования - сделать пользовательский элемент управления подключаемым.Я понимаю, что мог бы унаследовать базовый класс, но это вернуло бы меня к тому, чтобы иметь что-то вроде словаря вместо типизированной модели представления.

1 Ответ

1 голос
/ 27 мая 2010

Для этого вы можете использовать DisplayTemplates и EditorTemplates. Так что, если я правильно читаю ваш вопрос, у вас есть такая настройка:

Если вы используете .NET 4.0 (ура для ковариантных обобщений!)

System.Web.Mvc.ViewPage<MainViewModel<object>>

Если вы используете .NET 3.5:

System.Web.Mvc.ViewPage<MainViewModel<object>>

public class MainViewModel
{
    public object PartialViewsViewModel { get; set; }
}

Затем вы можете вызвать DisplayFor для этого объекта, чтобы получить частичное представление. Итак, ссылаясь:

<%= Html.DisplayFor(m => m.PartialViewsViewModel) %>

Будет искать шаблон в папке DisplayTemplates для обложки с именем вашего типа. Поэтому, если у вас есть ParticularViewModel.ascx в ваших DisplayTemplates, он будет использовать этот элемент управления в качестве «частичного представления». Если вы использовали какой-либо другой тип модели представления, выполните поиск OtherViewModel.ascx (например).

Шаблон для ParticularViewModel.ascx будет иметь:

System.Web.Mvc.ViewUserControl<ParticularViewModel>

Что позволяет вам рассматривать объект как строго типизированную модель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...