Что является лучшим способом визуализации отдельных дочерних классов по-разному - PullRequest
1 голос
/ 10 марта 2012

У меня есть базовый класс, который называется Vehicle.Из него я получил классы, называемые автомобилем, внедорожником, грузовиком и т. Д.

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

ListView.DataSource = List<Vehicle>;
ListView.DataBind();

The List<Vehicle> может быть смесью легковых, грузовых автомобилей и т. Д.

На странице aspx я хочу отображать их в соответствии со свойством типа транспортного средства.

<uc:VehicleView ID="VehicleView" runat="server" VehicleItem='<%#DataBinder.GetDataItem(Container) as Vehicle %>' />

Этот пользовательский элемент управления будетиметь правильный объект в коде позади при привязке данных.Все это работает до сих пор.

На странице списка перечислены только общие свойства из класса транспортных средств, но необходимо отображать разные вещи / макет для типа транспортного средства.

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

1 Ответ

1 голос
/ 10 марта 2012

С помощью составного элемента управления с привязкой к данным вы можете получить что-то вроде этого:

<asp:ListView runat="server">
  <ItemTemplate>
      <uc:CVehicleView runat="server" DataSource='<%# Container.DataItem %>'>
            <Car>
                  html for car goes here <%# Eval("SpecificCarProperty") %>
            </Car> 
            <Suv>
                  html for suv goes here <%# Eval("SpecificSuvProperty") %>
            </Suv>
      </uc:CVehicleView>
  </ItemTemplate>
</asp:ListView>

Реализация может быть немного хитрой, если вы не делали этого раньше, и большинство примеровпредназначены для списков (когда источником данных является список объектов).Вам необходимо переопределить метод CreateChildControls и создать соответствующий шаблон (используя тип элемента).

DetailsView и FormView - это хорошо известные элементы управления, предназначенные для отображения одного элемента и вызоваконкретный шаблон.Но оба элемента управления используют в качестве источника данных объект IEnumerable, поэтому в принципе вы не можете просто сделать вызов, подобный FormView.DataSource = car; FormView.DataBind(), потому что машина не реализует IEnumerable.Поэтому наличие источника данных IEnumerable немного важно.

Вы можете переопределить свойство DataSource

public class CVehicleView : CompositeDataBoundControl
{
    private object dataSource;
    public override object DataSource
    {
        get { return new List<object> { dataSource }; }
        set { dataSource = value; }
    }
}

, и разметка будет

<asp:ListView runat="server">
      <ItemTemplate>
          <uc:CVehicleView runat="server" VehicleDataSource='<%# Container.DataItem %>'>
 ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...