Hercal Ответов: 2

обновление переменной сеанса


Привет ,

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

в masterPage pageLoad я пишу этот код

//initial value of Session
    if (Session["DropLang_Value"] = null)
    {
        Session["DropLang_Value"] = 0.ToString();
        Session["DropLang_Text"] = English;.ToString();
    }



и напишите этот код в событии

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
   {
     Session["DropLang_Value"] = DropDownList1.SelectedItem.Value;
     Session["DropLang_Text"] = DropDownList1.SelectedItem.Text;
   }


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


Заказать Сейчас.код aspx-файл


public partial class Order_Now : BasePage
{
    protected void Page_Load(object sender, EventArgs e)
    {

SqlConnection con = new    SqlConnection(ConfigurationManager.ConnectionStrings["Myconecttion"].ConnectionString);
SqlCommand cmd = new SqlCommand("select*from ProductLoc where cultureid=@value", con);
cmd.Connection = con;
cmd.Parameters.AddWithValue("@value", Session["DropLang_Value"].ToString());
con.Open();
SqlDataReader r = cmd.ExecuteReader();
DropOrderType.DataTextField = "ProductName";
DropOrderType.DataValueField= "ProductId";
DropOrderType.DataSource = r;
DropOrderType.DataBind();
con.Close();      
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
    }
}



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

Проблема в том , что когда я захожу в Order_NOW.aspx и выбираю другой язык из выпадающего списка, переменная сеанса все еще имеет начальное значение (0) .
Выберите индекс изменен обновите значение но после выполнения моей страницы :(
Проблема заключается в том ,что переменная сеанса обновляется после события Page_Load
с главной страницы и страниц содержимого выполняется . :( :вздох: :растерянно:

Итак, как я могу решить эту проблему :-D

F-ES Sitecore

Если вы используете сеанс только как способ передачи данных с главной страницы на дочернюю, то вам лучше просто дать дочерней странице прочитать раскрывающееся значение непосредственно с главной страницы. Вы можете сделать это с помощью мастера.FindControl или Google, как использование строго типизированных главные страницы и вы можете выставить собственность на главную страницу, которая называется "текущий значение" или что-то, что возвращает значение из выпадающего списка.

2 Ответов

Рейтинг:
2

Vincent Maverick Durano

Геркулес писал::
PS: I didn't mean to necro-post. I haven't seen the original posted date for this thread as it get pushed to the top list of the current list.


Во-первых, вам не нужно этого делать. 0.ToString() при присвоении значению по умолчанию string Вы могли бы просто сделать это: string someAwesomeVariableName = "0";

Второй, Content Page события запускаются сначала раньше Master Page события вот почему вы получаете неожиданные результаты. Я бы посоветовал Вам почитать: События в городе ASP.NET основные и содержательные страницы[^]

В-третьих, я бы не рекомендовал использовать Session передавать данные между главной и содержательной страницами, так как это может быть трудно поддерживать. Существует два варианта доступа к элементам управления главной страницы с дочерней страницы содержимого.

Вариант 1: Использование метода FindControl

Например, если у вас есть DropDownList управление на главной странице с помощью ID="ddlLanguage", то на Вашей странице контента вы можете сделать:

DropDownList ddl = (DropDownList)Page.Master.FindControl("ddlLanguage"); 


Если вы работаете с такими элементами управления представлением данных, как GridView, Repeater и т. д. тогда поиск элементов управления на главной странице может быть немного сложным , особенно если вы не знаете, как эти элементы управления вложены. Вы можете попробовать реализовать рекурсивный метод FindControl метод точно такой же, как продемонстрированный здесь: Главная страница и FindControl

Вариант 2: Использование Свойств

Этот вариант является моим предпочтительным, так как я нахожу его простым в обслуживании и имеет меньше накладных расходов по сравнению с FindControl. Все, что вам просто нужно сделать, это определить общедоступное свойство в вашем коде главной страницы за файлом, который содержит значение DropDownList. Например:

public string MyPropertyOnMasterPage  
{  
        get  
        {  
            // Get value of control on master page  
            return ddlLanguage.SelectedValue;  
        }  
        set  
        {  
            // Set new value for control on master page  
            ddlLanguage.SelectedValue = value;  
        }  
} 


Затем в вашем выпадающем списке SelectedChanged event вы можете установить значение следующим образом:

protected void ddlLanguage_SelectedIndexChanged(object sender, EventArgs e){
     MyPropertyOnMasterPage = ddlLanguage.SelectedItem.Value;
}


Теперь, на Вашей странице контент разметки (.Aspx-файл), необходимо определить MasterType постановление об определении VirtualPath:

<%@ MasterType VirtualPath ="~/TheVirtualPathToYourMasterPageFileHere" %>


Как только вы все это установите, вы просто получите доступ к свойству MyPropertyOnMasterPage на Вашей странице контента C# код выглядит следующим образом:

protected void Page_Load(object sender, EventArgs e)  { 
     string selectedLanguage = Master.MyPropertyOnMasterPage;
}


В-четвертых, всегда оборачивайте свой код внутри !IsPostBack блок при привязке элемента управления внутри Page Load событие, чтобы избежать неожиданного поведения в обратных сообщениях.

protected void Page_Load(object sender, EventArgs e)  { 
     if(!IsPostBack){
        //your code here for binding the control
     }
}


Наконец, сделайте привычкой класть объекты, которые едят ресурсы, такие как SqlConnection, SqlCommand и SqlDataReader в операторе using, чтобы гарантировать, что объекты будут правильно утилизированы и закрыты после их использования. Вот обновленная версия вашего кода:

protected void Page_Load(object sender, EventArgs e)  { 
     if(!IsPostBack){
	   string sqlStatement = "select * from ProductLoc where cultureid= @value";
   	   string connectionString = ConfigurationManager.ConnectionStrings["Myconecttion"].ConnectionString;
        	using(SqlConnection connection = new SqlConnection(connectionString)){
           		using(SqlCommand cmd = new SqlCommand(sqlStatement ,connection)){
               	 	cmd.CommandType = CommandType.Text;
       	            	cmd.Parameters.AddWithValue("@value", Master.MyPropertyOnMasterPage);
           			using(SqlDataReader reader = cmd.ExecuteReader()){
					DropOrderType.DataTextField = "ProductName";
					DropOrderType.DataValueField= "ProductId";
					DropOrderType.DataSource = reader;
					DropOrderType.DataBind();
				}
        		}
        	}
     }
}


Рейтинг:
2

aidin Tajadod

Привет,

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

Другим способом может быть наличие свойства на вашей главной странице для передачи вам объекта dropdownlist или selectedvalue. а затем получите выбранное значение из вашего order_now.aspx ( я не уверен в этом решении, но вы можете проверить его) что-то вроде этого

cmd.Parameters.AddWithValue("@value", YourMaster.DDLProperty.SelectedValue.ToString());


просто обратите внимание, что в c# Вы можете получить DDLProperty, используя отражение примерно так:
System.Reflection.FieldInfo oFI= this.Master.GetType().GetField("DDLPropertyName",System.Reflection.BindingFlags.Instance  | System.Reflection.BindingFlags.NonPublic );
DropDownList oDDL= (DropDownList)oFI.GetValue(this.Master);

cmd.Parameters.AddWithValue("@value", oDDL.SelectedValue.ToString());