如果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
您必须覆盖CreateChildControls
事件,并在页面回发时动态添加控件。这将首先被调用,然后调用动态事件处理程序。
protected override void CreateChildControls()
{
PopulateControls();//populate your controls here
}