Как передать произвольный бит данных пользовательскому элементу управления в ASP.NET MVC с помощью Html.RenderPartial ()? - PullRequest
5 голосов
/ 15 декабря 2008

У меня строго типизированный пользовательский элемент управления («частичный»), и я хотел бы иметь возможность передавать ему некоторую дополнительную информацию из содержащего его представления. Например, у меня есть представление, привязанное к классу продукта, и у меня есть партиал, который также строго типизирован для той же модели, но мне также нужно передать дополнительный параметр для imageSize в мой партиал. Я хотел бы иметь возможность сделать что-то вроде этого:

<% Html.RenderPartial("_ProductImage", ViewData.Model, new { imageSize = 100 }); %>

Насколько я знаю, нет способа сделать это, но я надеюсь, что кто-то умнее меня, может иметь решение;)

Ответы [ 3 ]

5 голосов
/ 15 декабря 2008

Изменить тип частичной модели:

class PartialModel 
{
    public int ImageSize { get; set; }
    public ParentModelType ParentModel { get; set; }
}

Теперь передайте это:

<% Html.RenderPartial("_ProductImage", 
    new PartialModel() { ImageSize = 100, ParentModel = ViewData.Model }); %>
2 голосов
/ 16 декабря 2008

Не самое красивое решение

<% ViewData["imageSize"] = 100; %>

<% Html.RenderPartial("_ProductImage"); %>

ViewData передается по умолчанию

1 голос
/ 25 февраля 2009

Я использую универсальную модель класса - которая в принципе похожа на подход, предложенный Крейгом.

Я бы хотел, чтобы 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

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

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