2013-12-13 4 views
1

У меня есть список с невидимой меткой для хранения идентификатора категории. что я хочу сделать, это назначить текст метки куки или сессии при нажатии кнопки. Проблема заключается в том, что мой cookie всегда имеет значение null, когда я пытаюсь отобразить значение вне списка. вот мой ASPX код:Получите значение метки в listview

<asp:ListView runat="server" ID="catListView" DataSourceID="CategoriesDataSource" > 
      <EmptyDataTemplate>No DataFound</EmptyDataTemplate> 
      <ItemTemplate> 
       <div class="service" style="margin-bottom:10px;width:230px;">    
        <h4 style="font-family:Corbel;" ><%#Eval("CatName") %></h4> 
        <asp:Label runat="server" Visible="false" ID="lblcat"><%#Eval("CatId") %></asp:Label> 
        <asp:Button runat="server" ID="btnTest" Text="View Items" OnClick="btnTest_Click" /> 
       </div> 
      </ItemTemplate> 
     </asp:ListView> 

мой C# код:

protected void btnTest_Click(object sender, EventArgs e) 
     { 
      Response.Cookies["cat"].Value = "test"; 
      foreach (ListViewItem item in catListView.Items) 
      { 
       Label catLabel = (Label)item.FindControl("lblcat"); 
       Response.Cookies["cat"].Value = catLabel.Text.ToString(); 
      } 

     } 

любая помощь будет оценена. ТНХ заранее

Сэм

+0

Как вы пытаетесь отобразить его вне 'ListView'? Кроме того, catLabel.Text - это строка, не нужно вызывать '.ToString()' on it =) – jadarnel27

+0

@ jadarnel27 Нравится на странице aspx: <% = Request.Cookies ["cat"]. Значение%> – Sam

ответ

2

Похоже, ваш ListView не может быть привязка данных, когда вы вызываете событие Button click.

Я бы рекомендовал вам использовать the ItemCommand event handler. Это наиболее подходит для такого типа обработки. Обновите свою декларацию ListView обрабатывать это событие:

<asp:ListView runat="server" ID="catListView" DataSourceID="CategoriesDataSource 
    OnItemCommand="catListView_ItemCommand" > 

Примечание: Не забудьте удалить обработчик события «OnClick» от кнопки

А потом написать даже код обработчика, как это:

protected void catListView_ItemCommand(object sender, ListViewCommandEventArgs e) 
{ 
    Label catLabel = (Label)e.Item.FindControl("lblcat"); 
    Session["currentCatLabelText"] = catLabel.Text; 
} 

Это также имеет то преимущество, что вы не перебираете все элементы ListView, а просто смотрите на тот, который вы нажали.

+1

спасибо, я подумал об этом, прежде чем публиковать свой вопрос. , но у меня есть еще один код для события OnClick, могу ли я добавить его в listview? кажется глупым вопросом, но я действительно не использовал Itemcommand раньше. – Sam

+0

@ Самира Я не понимаю, что вы имеете в виду. Вам не нужно избавляться от всех ваших событий OnClick. Но если что-то внутри ListView, вы, вероятно, должны использовать ItemCommand. – jadarnel27

+1

Вы сказали, что я должен удалить обработчик события Onclick с помощью кнопки.Извините, мне показалось, что мне нужно удалить событие, а не код, связанный с ListView. спасибо за вашу помощь, я попробую :) – Sam

0

На самом деле вы пытаетесь добавить cat в одну клавишу. Я имею в виду, что вы переписываете значения в цикле.

Вы должны изменить свой код таким образом:

В вашем C# код:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (IsPostBack == false) 
     { 
      HttpCookie testCokkie = new HttpCookie("ExampleCookie"); 
      testCokkie.Expires = DateTime.Now.AddDays(5); 
      Response.Cookies.Add(testCokkie); 

     } 
    } 



protected void btnTest_Click(object sender, EventArgs e) 
    { 
     HttpCookie ExampleCookie = Request.Cookies["ExampleCookie"]; 
     int tempIndex = 0; 
     foreach (ListViewItem item in catListView.Items) 
     { 
      Label catLabel = (Label)item.FindControl("lblcat"); 
      ExampleCookie["cat" + tempIndex.ToString()] = catLabel.Text.ToString(); 
      tempIndex = tempIndex + 1; 
     } 
    } 

, чтобы прочитать это печенье

HttpCookie exampleCookie = Request.Cookies["ExampleCookie"]; 
if (exampleCookie != null) 
{ 
    int tempIndex = 0; 
    foreach (ListViewItem item in catListView.Items) 
    { 
     Response.Write("<br/>" + exampleCookie["cat" + tempIndex.ToString()]); 
     tempIndex = tempIndex + 1; 
    } 
} 
+0

thanks для вашей помощи, я еще не пробовал код, но у меня есть только комментарий. Я не хочу отображать cookie в файле response.write, я буду использовать его как параметр в моей процедуре в базе данных. хотите просто показать, чтобы убедиться, что это не пусто! Значит, я могу присвоить его ярлыку в файле cookie? – Sam

2

Надеется, что это помогает :)

string[] catvals = new string[catListView.Items.Count]; 

      for (int i =0; i< catListView.Items.Count; i++) 
      { 
       Label catLabel = (Label)catListView.FindControl("lblcat"); 
       catvals[i] = catLabel.Text; 
      } 
      for(int i = 0 ; i < catvals.Length; i++) 
      { 
       Response.Cookies["cat"+ i.ToString()].Value = catvals[i].ToString(); 
      } 
Смежные вопросы