Как мне создать представление из общего списка? - PullRequest
3 голосов
/ 10 октября 2009

У меня есть общий список List , и я хочу создать представление, которое повторяет список и выплевывает вывод.

Я сталкиваюсь с парой вопросов:

  • Я не знаю, как заставить мой view.aspx понять T
  • Я не знаю, как заставить его отобразить правильный фрагмент для T

Например, если я передаю список CustomObject1, я хочу отобразить частичный CustomObject1.ascx, а если я передаю список CustomObject2, я хочу отобразить частичный CustomObject2.ascx.

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

Любые идеи или решения будут с благодарностью приняты.

Ответы [ 3 ]

2 голосов
/ 10 октября 2009

Если ваши имена всегда будут совпадать (CustomObject1, то я хочу отобразить частичный CustomObject1.ascx), тогда вы можете использовать имя типа. Итак:

void MyMethod(List<T> items)
{
    foreach(T item in items)
    {
        Html.RenderPartial(item.GetType().Name, item);
    }
}
2 голосов
/ 10 октября 2009

Пример первого ответа Энтони: сделать содержимое списка ответственным за отображение, например,

interface IHtmlRenderable
{
    void RenderHtml();
}

void MyMethod(List<T> items) //where T implements IHtmlRenderable
{
    foreach(T item in items) ((IHtmlRenderable)item).RenderHtml();
}

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

1 голос
/ 10 октября 2009

Мне кажется, что сначала вам нужно использовать интерфейс, который является общим для всех ваших пользовательских объектов. Ваш вид будет основываться на List<IMyCommonInterface>.

Что касается включения правильного ascx, я не уверен, как даже общая система решит эту проблему.

Есть два подхода, которые я могу придумать.

  • Пусть ICommonInterface предоставит свойство, которое определяет используемый пользовательский элемент управления. Просто, но как-то все плохо и грязно.
  • Создайте класс Attribute, который можно использовать для украшения классов CustomObject. Этот атрибут указывает используемый элемент управления. Более сложный, потому что он требует немного размышлений, чтобы обнаружить значение атрибута, но почему-то кажется правильным и чистым.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...