【问题标题】:Session ending and restarting is preventing DropDownList_SelectedIndexChanged from firing会话结束和重新启动阻止 DropDownList_SelectedIndexChanged 触发
【发布时间】:2015-07-26 08:07:42
【问题描述】:

ASP.NET 会话结束和重新启动是否会干扰(阻止)在下拉列表上触发 SelectedIndexChanged 事件?

表单正在回发,但我的断点没有被命中?

在会话重新启动之前一切正常。

这是控件的asp:

<asp:DropDownList ID="dlSort" runat="server" AutoPostBack="true" 
                  onselectedindexchanged="dlSort_SelectedIndexChanged">
</asp:DropDownList>

这是部分代码:

protected void dlSort_SelectedIndexChanged(object sender, EventArgs e)
{
    PopulateItems();
    //Breakpoint above- not hit after session restarts, but hit prior to session end.
}

我留下了一个空表单,因为它没有被重新填充...

提前致谢,

M

编辑 1:

这是填充控件的代码:

protected void Page_Load(object sender, EventArgs e)
{
    Form.Action = Request.RawUrl;//Required as page is rewritten
    if (!IsPostBack)
    {
        SetNoItemsMessage("");
        PopulateSortDropDown();
        PopulateItems();
    }
}

private void PopulateSortDropDown()
{
    clsProducts ops = new clsProducts();
    DataTable dt = ops.GetProductSortDropDownData();
    dlSortBy.DataSource = dt;
    dlSortBy.DataBind();
    dlSortBy.ClearSelection();
    dlSortBy.SelectedValue = "1";
}

编辑 2:

为了澄清,PopulateItems() 方法填充了一个数据中继器,并且应该在排序下拉列表的索引更改时运行 (dlSort_SelectedIndexChanged) - 尽管正在发生回发,但这并没有发生。

Page_Load 执行填充 dlSort 的方法,该方法始终在运行。

我已经广泛检查了该页面,除了索引更改事件之外的所有内容都会触发。

编辑 3:

void Session_Start(object sender, EventArgs e)
{
    InitialiseCommonSessionVariables();//This piece of code sets default values for session variables that are used in every case.
}

【问题讨论】:

  • PopulteItems() 方法中是否使用了任何会话变量?
  • 谢谢,是的,使用了会话变量,但会话是通过一个对象访问的,该对象在访问单个变量之前检查初始化会话。主要问题是 dlSort_SelectedIndexChanged 在会话丢失并重新建立后根本没有触发。
  • 发布初始填充 DDL 的代码。可能相关的事情:它在页面生命周期的哪个位置填充(例如 Page_Load)?是否仅在 IsPostBack 为假时才填充?是否启用了 ViewState?您的症状表明回发中未填充 DDL。
  • @Joe 查看编辑 - Page_Load,IsPostBack 为 false,ViewState 已启用。
  • @Mack - PopulateSortDropDown 中的“panelsort.Visible = true”看起来很可疑。这意味着它在 Postback 上可能是错误的,在这种情况下,面板中包含的 DDL 可能不会从 ViewState 重新填充。拼写错误的“dlSoryBy.DataBind”也只是一个错字吗?

标签: c# asp.net session webforms


【解决方案1】:

我遇到了类似的情况,不得不使用 Page_PreRender 事件来解决它。

在您的情况下,您可以测试 PopulateItems() 是否已经运行,如果没有在预渲染中运行。

【讨论】:

  • 嗨@ohoundj,我暂时实现了类似的东西,但想了解并克服潜在问题。
  • 在解决方法到位并且似乎成功时奖励赏金,但是我仍然对根本原因感兴趣,并且对任何进一步的 cmets 感兴趣。
【解决方案2】:

我认为原因可能在于身份验证设置。由于重置身份验证,会话过期后触发的回发可能会将您引导至登录页面。

甚至重定向可能是透明的,在重定向到登录页面后,您将丢失所有 Post 参数,在最近的回发请求中指定。

这意味着,ASP.NET 将无法检测哪个控件触发了回发(它依赖于 EVENTTARGET 参数),因此不会触发 SelectedIndexChanged 事件。

【讨论】:

  • 我现在正在试验 EVENTTARGET,稍后将返回结果。
  • 我已经使用@SurajSingh 在这篇文章link 中的回答实现了检查 EVENTTARGET 的代码,它确实是 dlSortBy。然后点击 Page_Load(不运行 dlSort_SelectedIndexChanged),点击 Page_PreRender。
  • 看起来很奇怪,刚刚用同样的方法检查了一个干净的项目,它似乎工作正常——即使在会话过期后事件也会成功触发。会话结束后,您能否检查是否在 PageLoad 上填充了您的案例中的项目?
  • 所有控件都已填充。
【解决方案3】:
            ASP.Net Code :
       ---------------

    <asp:DropDownList ID="ddList" runat="server" AutoPostBack="True" Height="65px" OnSelectedIndexChanged="ddList_SelectedIndexChanged" Width="198px">
        </asp:DropDownList>


C# Code :
---------

 public void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                dropdown();
            }
        }
.
<your code goes here> ....

public void dropdown()
        {
            //String Sql statement
            string Sqlstr = "select CountryCode,Description from ca_countryMaster order by description";


            string DBCon = "Data Source=RAJA;Initial Catalog=CareHMS;Integrated Security=True;";
            SqlConnection SqlCon = new SqlConnection(DBCon);
            SqlCon.Open();

            SqlDataAdapter Sqlda = new SqlDataAdapter(Sqlstr, SqlCon);
            DataSet ds = new DataSet();
            Sqlda.Fill(ds);
            ddList.DataSource = ds.Tables[0];
            ddList.DataTextField = "Description";
            ddList.DataValueField = "CountryCode";
            ddList.DataBind();

            ds.Dispose();
            Sqlda.Dispose();
            SqlCon.Close();
        }

【讨论】:

  • 嗨@Suttipasanga,这段代码似乎填充了一个下拉列表,这不是我遇到的问题,错误是在会话重新启动后,下拉列表的 SelectedIndexChanged 事件没有在回发时触发。
猜你喜欢
  • 2023-02-06
  • 2011-06-24
  • 2021-10-10
  • 2015-06-28
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-07
相关资源
最近更新 更多