2009-05-03 4 views
5

Может ли кто-нибудь попытаться рекомендовать наилучшие причины для решения нижеуказанного запроса:. Сетевой эквивалент повторителя для одного объекта?

Я создал несколько расширенных классов, используя класс Repeater в качестве базы и люблю гибкость, легкость и результаты этого , Теперь я хочу сделать аналогичный пользовательский веб-элемент управления для одного объекта (т. Е. DataSource не реализует IListSource или IEnumerable). Я создал структуру того, чего я пытаюсь достичь, расширив ретранслятор, а затем установив источник данных, используя список из 1 элемента для хранения объекта, а затем привязка данных.

e.g a rough example: 

    Dim oObj as New MyObject(1) 
    Dim gl As New Generic.List(of MyObiect)() 
    gl.Add(oObj) 
    rpt.DataSource = gl 
    rpt.DataBind() 

Это походит на небольшой хак вокруг вещей, что я хотел бы быть в состоянии сделать это следующим образом:

e.g new call, where my control is the new custom control: 

    Dim oObj as New MyObject(1) 
    myControl.DataSource = oObj 
    myControl.DataBind() 

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

<My:ObjControl ID="frm" runat="server"> 
    <Tabs> 
     <My:Tab name="Details"> 
      <Items> 
       <My:Item Type="Text" Label="First Name" Property="FirstName" /> 
       <My:Item Type="Text" Label="Last Name" Property="LastName" /> 
       <My:Item Type="Text" Label="Title" Property="Title" /> 
      </Items> 
     </Tab> 
     <My:Tab name="Address"> 
      <Items> 
       <My:Item Type="Text" Label="Address 1" Property="Address1" /> 
       <My:Item Type="Text" Label="Address 2" Property="Address2" /> 
       <My:Item Type="Text" Label="Address 3" Property="Address3" /> 
      </Items> 
     </Tab> 
    </Tabs> 
</My:ObjControl> 

Эта реализация должна происходить с использованием WebForms, хотя, похоже, используя MVC будет идеальный подход учитывая вышеизложенное. Делая это, я хочу создать гибкий WebControl, который использует отражение (которое может использоваться для всех классов, которые реализуют определенный интерфейс), который будет генерировать требуемую форму только с тремя строками кода (выше) каждый раз, когда это необходимо.

Должен ли я просто добавить свойство к пользовательскому ретранслятору (DataObject), который принимает объект и соответствующим образом устанавливает DataSource и сохраняет мое время? Или есть лучший способ?

Надеюсь, это все имеет смысл!

Приветствия, Стив

ответ

5

Вы пытаетесь способ трудно обойти тот факт, что ретранслятор хочет список, и вы хотите, чтобы дать ему 1 экземпляр. Просто оберните его в новый список * oObj) и двигайтесь дальше. Это делается все время.

Я, конечно, не знаю, что они делают с этим настраиваемым серверным управлением. Кажется, вы снова пытаетесь.

<asp:repeater id="whatever" runat=server> 
    <ItemTemplate>First Name: <%# DataBinder.Eval(Container.DataItem,"FirstName") %></ItemTemplate> 
</asp:repeater> 
+0

Хорошо, что очень сложно преодолеть мыслительный процесс, но то, что мой контроль достигнет, - это создать страницу с двумя закладками «Детали» и «Адрес», которые могут быть вставлены между ними и на каждом из них будут иметь метки и соответствующие элементы формы, которые могут обновлять объект. То, что вы показали, полностью пропустило - возможно, моя вина в формулировке вопроса. Конечно, в вашем, например, я мог просто сделать: Eval («FirstName»). – stibstibstib

+1

Все еще слишком много, чтобы сделать много работы для нескольких вкладок, и я по-прежнему рекомендую повторитель. Да, я полностью не понимаю ваш вопрос. Я не использую Eval, DataBinder.Eval - это 1.0 способ сделать это, и я не вижу причин для изменения, Habit. –

2

Я полностью понимаю вашу точку зрения, stibstibstib. Я также хочу, чтобы ASP.NET Framework поставлялась с управляемым шаблоном сервером, например ListView, но для одного объекта данных. Кажется излишним, и он чувствует себя довольно хакивым, чтобы создать список из одного элемента, чтобы заставить его работать с Repeater и ListView. Я понимаю, что это работает. Я понимаю, что это простое решение. Но ASP.NET - это Framework, и это просто кажется упущением, которое должно быть исправлено. В этой статье http://gadgetopia.com/post/5343 затрагивается одна и та же концепция, что существуют два основных способа просмотра контента на веб-сайте: как отдельный элемент, так и как элемент в списке. По-прежнему удивлен, что ASP.NET не имеет ничего похожего на управление сервером ItemView.

1

В некоторых ситуациях вы можете использовать DetailsView.