Каков наилучший способ визуализации отдельных дочерних классов по-разному в виде списка

У меня есть базовый класс под названием Vehicle. Я получил уроки от него под названием car, Suv, Truck и т.д.

То, что мне нужно, это привязать их к списку, как показано ниже.

ListView.DataSource = List<vehicle>;
ListView.DataBind();
</vehicle>

List может представлять собой смесь автомобилей, грузовиков и т.д.

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

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

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

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

1 ответ

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

<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 - это хорошо известные элементы управления, предназначенные для отображения одного элемента и вызова определенного шаблона. Но оба элемента управления используют в качестве объекта DataSource объект IEnumerable, поэтому в основном вы не можете просто позвонить, например FormView.DataSource = car; FormView.DataBind() 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; }
 }
}
 <p> и разметка будет</p> <pre class="prettyprint linenums"><code>&lt;asp:listview runat="server"&gt;
 &lt;itemtemplate&gt;
 &lt;uc:cvehicleview runat="server" vehicledatasource="&lt;%# Container.DataItem %&gt;"&gt;
 ...
&lt;/uc:cvehicleview&gt;&lt;/itemtemplate&gt;&lt;/asp:listview&gt;</code>

licensed under cc by-sa 3.0 with attribution.