2010-03-30 4 views
1

У моего источника данных есть Rating dataItem содержит целое число от 0 до 5. Я хотел бы печатать звезды в соответствии с законом.Могу ли я использовать циклы в репитере? Рекомендуется ли это?

Я пытаюсь сделать это в Repeater управления:

<b>Rating:</b> 

<% for (int j = 1; j <= DataBinder.Eval(Container.DataItem, "Rating"); j++) 
{ %> 
<img src="App_Pics/fullstar.png" /> 
<% } 
for (int j = 1; j <= 5 - DataBinder.Eval(Container.DataItem, "Rating"); j++) 
{ %> 
<img src="App_Pics/emptystar.png" /> 
<%} %> 
  1. Я получаю ошибку The name 'Container' does not exist in the current context. Это странно, потому что когда я использовал <%# DataBinder.Eval(Container.DataItem, "Name")%> линию раньше, она отлично работала.
  2. Умело ли включать петли на моей странице aspx? Я думаю, что это не очень удобно. Каковы мои альтернативы?
  3. Что это такое #?

спасибо.

+0

Действительно две разные проблемы. Проблема А связана с нюансами того, как работает DataBinder.Eval. Задача B более кратко изложена как «я должен контактировать с петлями». Проблема А - реальная проблема для вас, я думаю. –

ответ

5

# указывает код, который должен быть выполнен, когда data-binding occurs (т. Е. Когда DataBind() вызывается на элементе управления или на странице). Синтаксис <%# %> является привязкой к данным, равным <%= %>, поэтому, к сожалению, вы не можете просто обернуть свой цикл в <%# %> блоками и сделать это.

Вы можете обойти это ограничение по реализации кода за метод и передавая рейтинг методу:

<%# GetStars(Convert.ToInt32(DataBinder.Eval(Container.DataItem, "Rating"))) %> 

А затем реализовать метод, как:

protected string GetStars(int rating) 
{ 
    string output = string.Empty; 
    for (int j = 1; j <= rating; j++) output += "<img src=\"App_Pics/fullstar.png\" />"; 
    for (int j = 1; j <= 5 - rating; j++) output += "<img src=\"App_Pics/emptystar.png\" />"; 
    return output; 
} 
+0

На самом деле, мне понравился ваш путь лучше всего. Спасибо. BTW, есть ли разница между output = "" и output = string.Empty? – iTayb

+1

@iTayb, string.Empty - предпочтительный метод обозначения пустого строкового значения, но не все согласны. См. Http://stackoverflow.com/questions/263191/in-c-should-i-use-string-empty-or-string-empty-or –

+1

Между «" и строкой.Empty нет никакой практической разницы. Единственная причина, по которой я его использую, - продемонстрировать мое намерение (т. Е. Я хотел создать пустую строку). –

2

# указывает элемент данных, поэтому вы видите упомянутую вами ошибку; вы используете DataBinding вне контекста.

Лучшим решением было бы преобразование вашей звезды в внешний элемент управления (контроль ascx). Вы можете добавить свойство под названием «Рейтинг», назначить его из контекста привязки данных и выполнить цикл в элементе управления star rater.

1

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

0

Я не уверен, что петли - такая отличная идея с контролем Repeater. Лучшей практикой является цикл самого DataSource (в кодировке), поэтому Repeater нужна только одна итерация для визуализации HTML.

Если вам нужна какая-то составная структура HTML для отображения, я бы пошел с решением jvenema и использовал другой файл UserControl для его рендеринга.

1

Я бы не рекомендовал использовать цикл таким образом. Есть, конечно, способы сместить 5 изображений вместе, как вам нужно, со звездами вкл или выкл, но другая идея состоит в том, чтобы просто создать 6 статических изображений, включив от 0 до 5 звезд. 0star.jpg, 1star.jpg и т. Д. Тогда ваше значение «рейтинг» можно использовать просто для создания соответствующего имени файла.

0

Лучше всего было бы для меня, чтобы иметь что-то вроде:

отделенного кода:

protected List<int> Stars = new List<int> { 1, 2, 3, 4, 5 }; 
protected int RankingStars = 3; 

ASPX:

<asp:Repeater runat=server ID=C_Rep_StarsFull DataSource=Stars > 
    <ItemTemplate> 
      <img src="App_Pics/fullstar.png" runat=server 
       visible=<%# RankingStars >= (int)Container.DataItem %>/> 
    </ItemTemplate> 
</asp:Repeater> 
<asp:Repeater runat=server ID=C_Rep_StarsEmpty DataSource=Stars > 
    <ItemTemplate> 
      <img src="App_Pics/emptystar.png" runat=server 
       visible=<%# RankingStars < (int)Container.DataItem %>/> 
    </ItemTemplate> 
</asp:Repeater> 
Смежные вопросы