微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

母版页中的下拉列表未返回由内容页设置的默认值

如何解决母版页中的下拉列表未返回由内容页设置的默认值

我有一个绑定到数据源的DropDown。并具有自动回传为true的功能,以便我可以根据所选值调用中间层。但是,认情况下,下拉菜单中的第二个值是由页面加载事件中的内容页面选择的。但是内容页面上的方法无法获取所选值。

<asp:DropDownList ID="ddlStatuses" runat="server" DataSourceID="dsstatus" AutopostBack="true" Enabled="false" Visible="false"
    DataTextField="Description" DataValueField="StatusId" OnSelectedindexChanged="ddlStatuses_SelectedindexChanged">
</asp:DropDownList>

在主页代码的背后,我有以下几种获取,设置状态的方法

public delegate void StatusHandler(object sender,EventArgs e);
        
public partial class MasterPageTest: System.Web.UI.MasterPage    
{
    public event StatusHandler StatusChanged;    
    
    protected virtual void OnStatusChanged(EventArgs e)
    {}
    
    public int SelectedStatus()
    {
        return ddlStatuses.SelectedValue.ToInt();
    }
    
    public bool ShowStatusDDL
    {
        get { return ddlStatuses.Visible; }
        set { ddlStatuses.Enabled = ddlStatuses.Visible = value; }
    }
    
    public void SetSelectedStatusDDL()
    {
        ddlStatuses.SelectedValue = Statuses.Unread.ToString();
    }
    
    protected void ddlStatuses_SelectedindexChanged(object sender,EventArgs e)
    {
        if (StatusChanged != null)
        {
            StatusChanged(this,e);
        }
    }
}

内容页面在页面加载下拉菜单中设置认状态,然后尝试调用将所选值传递给中间层的方法。这就是问题所在-加载时未获得认值,但在下拉菜单更改时,它按预期工作。

protected void Page_Load(object sender,EventArgs e) {
    Master.StatusChanged += Master_StatusChanged;

if(!IsPostBack) {        
    Master.ShowStatusDDL = true;
    Master.SetSelectedStatusDDL(); //Setting the status to say 2nd item in the list

    MainFunctionality();
}

private void MainFunctionality()
{
    var statusId = Master.SelectedStatus();   // This doesn't show the selected status but blank
    //Some more code that passes the statusId to the middle tier
}

为什么它没有获得认值,我敢肯定我没有看到一些愚蠢的东西。但是,我已经花了几个小时进行调试。

这里还有一些背景知识: 最初,我在内容页面aspx中有一个ObjectDataSource,将结果加载到GridView中,随后的事件dsMessages_Selecting读取了Master.SelectedStatus()并将其传递给数据源获取过滤的数据。并且此事件能够读取所选的下拉值。我删除了该对象数据源,以在页面加载后的代码中编写自己的对象。现在,所选下拉菜单不起作用。尽管内容页面加载会设置认值,但是我缺少一些其他事件来确保选择了该值。

解决方法

我已解决了该问题,对于将来可能会遇到此问题并花大量时间来理解该问题的其他人,我正在发布解决方案。

问题出在事件的触发方式上,这要感谢@VDWWD使我思考事件如何被触发。

我在content page_load事件中有一个代码,用于设置下拉菜单的默认选择,然后是使用所选值加载网格的代码。

protected void Page_Load(object sender,EventArgs e) {
    Master.StatusChanged += Master_StatusChanged;

    if(!IsPostBack) {        
        Master.ShowStatusDDL = true;
        Master.SetSelectedStatusDDL(); //Setting the status to say 2nd item in the list

        MainFunctionality();
    }
}

此网格未根据选择过滤数据,因为内容page_load不知道选择的内容,因此我认为在事件生命周期中稍后会对其进行更新。

因此,我将MainFunctionality()从内容page_load移到了内容gridview_PreRender,以延迟查找所选下拉值的调用。由于这几乎是在卸载事件之前触发的最后一个事件,因此我认为届时将获得选定的下拉值。而且,它完全按照我希望的方式工作。

以下是将母版页与内容页合并以供参考时发生的事件的顺序:

内容页面的PreInit事件。

母版页控制Init事件。

内容控制Init事件。

主页面初始化事件。

内容页面初始化事件。

内容页面加载事件。

母版页加载事件。

母版页控制加载事件。

内容页面控制加载事件。

内容页面的PreRender事件。

母版页PreRender事件。

母版页控制PreRender事件。

内容页面控制PreRender事件。

母版页控件卸载事件。

内容页面控制卸载事件。

母版页卸载事件。

内容页面卸载事件。

From Microsoft Documentation

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。