2013-12-26 4 views
0

Я пытаюсь динамически создавать asp-код на стороне клиента. У меня есть такой код:клиентская сторона aspx динамически создает asp-теги

<% foreach (Product item in ProductList()) 
     { <div class="prod_box"> 
    <div class="center_prod_box"> 

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

<div class="product_title"><%:item.Name %></div> 
     <div class="product_img"><img src="Images/<%:System.IO.File.Exists(Server.MapPath("~/Images/"+item.Image))?item.Image:"default_image.jpg"%>" alt="" width="60" height="60" border="0" /></div> 
     <div class="prod_price"> <span class="price"><%:item.Price%></span></div> 

Как вы видите, <%: item.FIELD%> работает в любом теге HTML.

Но что, если я хочу, чтобы теги были объектами asp, а не просто HTML? Такого рода вещи не работает:

<asp:Button runat="server" Text="addToCart" class="prod_buy" OnClick="Add_Click" CommandArgument="<%#item.Code%>"/> 

Я получаю сообщение об ошибке: «Название„элемент“не существует в текущем контексте».

Как я могу динамически создавать asp-объект на стороне клиента aspx?

+0

В случае кнопки вы используете <% #, который является в основном привязкой данных, но нет никаких данных Bound управления, так что вам нужно использовать <% или <% : –

+0

он просто распечатывает текст как есть, аргументы <%item.code%> и то же, что и с: – Programer

+0

Попробуйте использовать 'CommandArgument =" <% # Eval ("item.Code")%> "' –

ответ

2

ASP.NET - это серверная технология. Клиентская сторона не может создавать теги на стороне сервера.

+0

Так что же такое решение для такого поведения? – Programer

+0

Создайте теги на стороне клиента с клиента или теги на стороне сервера с сервера. –

2

ASP.Net - это серверная технология, которая анализируется на сервере и динамически создает HTML и JavaScript, которые затем передаются клиенту. Клиентский браузер является технологическим агностиком; он не знает и не заботится, использовал ли сервер ASP.Net, Ruby/Rails, PHP, Java или любую другую технологию для создания HTML и JavaScript. Если вы пытаетесь изменить вывод на клиенте, вы должны либо использовать JavaScript для совершения вызовов на сервер, чтобы запросить новую информацию, а затем изменить значения данных (обычно называемые AJAX, аббревиатурой для асинхронного JavaScript и XML), или вы должны выполнить полный возврат на сервер и повторить визуализацию HTML-кода сервером. Новые ASP-технологии (например, ASP.Net MVC) используют комбинацию технологий Server Side и JavaScript, чтобы сделать этот процесс менее ручным, но в конечном итоге они скрывают реализацию вызовов AJAX.

Редактировать

После повторного прочтения вашего поста, я считаю, что я понимаю, что вы пытаетесь сделать. CommandArgument - это буквальная строка, в которую вы пытаетесь записать значение переменной, прежде чем передавать ее клиенту. Для этого вам нужно использовать ключевое слово #Eval, то есть CommandArgument='<%#Eval("item.Code")%>'. Это устанавливает одностороннюю привязку для этого значения в свойстве string.

+0

Я знаю это. Но это не помогает. Клиент получит html, независимо от того, если я напишу <%: item.Name%> или . Оба варианта передаются в HTML в браузере. Так почему же это не может быть комбинацией? – Programer

+0

Да, мне кажется, что «Клиентская сторона» Он на самом деле означает «Разметка». Где клиентская сторона обычно используется для обозначения функциональности DHTML. –

0

Похоже, что нет никакого способа ссылаться на переменную asp внутри заданного серверного элемента управления.

Вместо этого я предлагаю использовать ретранслятор, поскольку он не генерирует HTML, дает вам доступ к активному элементу и позволяет оценивать значения на элементах управления сервером.

<asp:Repeater ID="rpt" runat="server"> 
    <ItemTemplate> 
     <%# Eval("Name") %> 
     <asp:Button runat="server" CommandArgument='<%# Eval("Code") %>'/>  
    </ItemTemplate> 
</asp:Repeater> 

Связывание его:

rpt.DataSource = ProductList(); 
rpt.DataBind(); 

Одним из недостатков было бы отсутствие контроля потока (если заявление).В случае, если вам нужно, что вы могли бы использовать заполнители

<asp:Repeater ID="rpt" runat="server"> 
    <ItemTemplate> 
     <asp:PlaceHolder ID="phTrue" runat="server" Visible='<%# Condition %>' > 
      <div>True</div> 
     </asp:PlaceHolder> 
     <asp:PlaceHolder ID="phFlase" runat="server" Visible='<%# !Condition %>' > 
      <div>False</div> 
     </asp:PlaceHolder> 
    </ItemTemplate> 
</asp:Repeater> 
Смежные вопросы