【发布时间】: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