如果ListView绑定在Page_Load中,则不会激发在ListView中创建的动态控件的EventHandlers

本文关键字:ListView 动态控件 EventHandlers 创建 Page 绑定 Load 如果 | 更新日期: 2023-09-27 17:58:54

在我们的intranet ASP.NET应用程序中,我们使用类似于MVVM模式的体系结构方法。描述视图状态的视图模型是在Page_Load中从ViewState创建或加载的。然后根据视图模型内容动态创建页面。现在我面临着一个问题,我无法找到一个优雅的解决方案。

问题是,我们必须处理由控件触发的事件,这些控件是在ListView中动态创建的。但是,只有当listView在Page_Init中被数据绑定时,这些注册的事件才会触发。如果数据绑定发生在Page_Load中,则不会触发这些事件。现在的问题是,我们需要我们的ViewModel来将ListView数据绑定到它。这个ViewModel缓存在ViewState中,据我所知,它只能在Page_Load中访问。这意味着在Page_Init中我们无法访问ViewModel。

我创建了以下示例:

ASP:

<form id="form1" runat="server">
    <asp:ListView runat="server" ID="lstView" ItemPlaceholderID="itemPlaceHolder">
        <LayoutTemplate>
            <asp:PlaceHolder runat="server" ID="itemPlaceHolder" />
        </LayoutTemplate>
        <ItemTemplate>
            <asp:DropDownList runat="server" ID="dropDown" SelectedValue='<%# Bind("SelectedValue") %>' DataSource='<%# Eval("Choice") %>' AutoPostBack="true" />
        </ItemTemplate>
    </asp:ListView>
</form>

代码背后:


namespace WebApplication1
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Init(object sender, EventArgs e)
        {
                     //if i put the Initialization logic here, the event gets fired, however the Model is not accessible from the viewstate
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            InitializeModel();
            lstView.DataSource = _model.NestedModels;
            lstView.ItemCreated += (k, args) =>
            {
                var dropDown = (DropDownList)args.Item.FindControl("dropDown");
                dropDown.SelectedIndexChanged += new EventHandler(dropDown_SelectedIndexChanged);
            };
            lstView.DataBind();
        }
        void dropDown_SelectedIndexChanged(object sender, EventArgs e)
        {
            Response.Write("Selected Index Changed fired");
        }
        private MyModel _model;
        void InitializeModel()
        {
            if (ViewState["model"] == null)
                ViewState["model"] = new MyModel();
            _model = (MyModel) ViewState["model"];
        }
    }
    [Serializable]
    public class MyModel
    {
        [Serializable]
        public class NestedModel
        {
            public NestedModel()
            {
                Choice = new List(new[] { "Value1", "Value2", "Value3", "Value4", "Value5" });
            }
            public string SelectedValue { get; set; }
            public List Choice { get; set; }
        }
        private List _nestedModels = new List();
        public MyModel()
        {
            Init();
        }
        public List NestedModels
        {
            get { return _nestedModels; }
        }
        void Init()
        {
            NestedModels.Add(new NestedModel() {SelectedValue = "Value1"});
            NestedModels.Add(new NestedModel() { SelectedValue = "Value2" });
            NestedModels.Add(new NestedModel() { SelectedValue = "Value3" });
            NestedModels.Add(new NestedModel() { SelectedValue = "Value4" });
            NestedModels.Add(new NestedModel() { SelectedValue = "Value5" });
        }
    }
}

我希望你们中的一个人知道一种方法,要么保留我的事件以被解雇,要么在Page_Init中检索我缓存的ViewModel。

谨致问候,TH

如果ListView绑定在Page_Load中,则不会激发在ListView中创建的动态控件的EventHandlers

您必须覆盖CreateChildControls事件,并在页面回发时动态添加控件。这将首先被调用,然后调用动态事件处理程序。

protected override void CreateChildControls()
{
   PopulateControls();//populate your controls here
}