【问题标题】:Dropdownlist in masterpage is not returning a default value that was set by content page母版页中的下拉列表未返回由内容页设置的默认值
【发布时间】:2020-10-21 21:24:23
【问题描述】:

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

<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()以将其传递给数据源以获取过滤后的数据。此事件能够读取选定的下拉值。我删除了该对象数据源,以便在页面加载后的代码中编写我自己的数据源。现在,选定的下拉菜单不起作用。尽管内容页面加载设置了默认值,但我还缺少一些其他事件来确保该值被选中。

【问题讨论】:

  • 母版页的 Page_load 在内容页的 Page_load 之后执行。也许这就是问题所在。
  • 母版页的page_load 没有我的代码,我在内容page_load 中设置了值。我确信这与事件生命周期有关,但还无法确定。我已经用更多细节更新了 OP。

标签: c# asp.net dropdown master-pages


【解决方案1】:

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

问题在于事件的触发方式,感谢 @VDWWD 让我思考事件是如何触发的。

我在内容 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 事件。

母版页控件 Unload 事件。

内容页面控制 Unload 事件。

母版页卸载事件。

内容页面卸载事件。

From Microsoft Documentation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 2010-11-07
    • 2012-06-21
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多