Я использую универсальную модель класса - которая в принципе похожа на подход, предложенный Крейгом.
Я бы хотел, чтобы MS создала перегрузку на RenderPartial
, чтобы дать нам такую же функциональность. Просто дополнительный параметр object data
подойдет.
В любом случае, мой подход заключается в создании PartialModel, который использует универсальные шаблоны, чтобы его можно было использовать для всех элементов управления .ascx.
public class PartialControlModel<T> : ModelBase
{
public T ParentModel { get; set; }
public object Data { get; set; }
public PartialControlModel(T parentModel, object data) : base()
{
ParentModel = parentModel;
Data = data;
}
}
Элемент управления .ascx должен наследоваться от правильного PartialControlModel
, если вы хотите, чтобы представление было строго типизировано, что, скорее всего, вы сделаете, если у вас так далеко.
public partial class ThumbnailPanel :
ViewUserControl<PartialControlModel<GalleryModel>>
Тогда вы делаете это так:
<% Html.RenderPartial("ThumbnailPanel",
new PartialControlModel<GalleryModel>(ViewData.Model, tag)); %>
Конечно, когда вы ссылаетесь на любые родительские элементы модели, вы должны использовать этот синтаксис:
ViewData.Model.ParentModel.Images
Вы можете получить данные и привести их к правильному типу с помощью:
ViewData.Model.Data
Если у кого-нибудь есть предложения по улучшению используемых мной дженериков, пожалуйста, дайте мне знать.