无法从Web控件

时间:2015-08-06 18:50:05

标签: c# asp.net

我有一个自定义Web控件,我需要从控件内的List对象获取对象数量的计数。在更详细的术语中,我有一个我需要维护的List属性,并且知道网页列表中存在的受众数量。不幸的是,即使我在列表中添加项目,Count也总是返回0。

在代码执行期间的各个地方,计数是正确的,但是一旦我返回.aspx页面,它就像对象已被完全擦除一样。我认为每次页面加载时我的Web控件都会覆盖这些值,但如果是这种情况,我不确定如何防止这种情况。

这是我的第一个使用其中一些技术的项目,所以我可能会接近错误。任何帮助将不胜感激。谢谢。

基础对象:

public class Audience
{
    public String name { get; set; }
    public String id { get; set; }
    public Int16 type { get; set; }

    public Audience() { }
 }

可枚举的类列表<受众>:

public class Audiences : IEnumerable
{

    List<Audience> audienceList = new List<Audience>();

    public Audiences() { }

    public IEnumerator GetEnumerator()
    {
        return (IEnumerator)this;
    }

    public void addToList(List<Audience> audiences)
    {
        foreach (Audience audience in audiences)
        {
            audienceList.Add(audience);
        }
    }

    public int count()
    {
        return audienceList.Count();
    }
}

AudienceControl Web控件类:

public partial class AudienceControl : System.Web.UI.UserControl
{
    public Audiences audienceList = new Audiences();


    protected void Page_Load(object sender, EventArgs e)
    {
        if ((Audiences)ViewState["audienceList"]!=null)
            audienceList = (Audiences)ViewState["audienceList"];
    }

    //Other functions to add/search/etc...

   protected void add_Click(object sender, EventArgs e)
    {
       List<Audience> audiences = new List<Audience>();
       ...
       audienceList.addToList(audiences);

       ViewState["audienceList"] = audienceList;
    }
 }

.ASPX代码始终返回零。

    Page_Load() 
   {
       Response.Write("The audience count is " + AudienceControl.audienceList.count());
   }

有效的代码:

    protected void Page_LoadComplete(object sender, EventArgs e)
    {
        if (AudienceControl.audienceList != null)
        {
            Response.Write("The audience count is " + AudienceControl.audienceList.count());
        }
    }

修改 向Web Control添加了add_Click()代码,以显示调用audienceList.addToList()的位置。

找到解决方案 这个问题显然存在于页面生命周期中。当Page_Load事件触发时,不会加载自定义控件,因此即使存储到ViewState,也没有任何audienceList对象 提供任何数据。但是,当我添加Page_LoadComplete并在那里测试计数时,计数是正确的。感谢所有提出问题并提供反馈的人。我感谢您的时间和帮助。

2 个答案:

答案 0 :(得分:1)

您是否有继承IEnumerable的原因?使用您发布的代码似乎并不是它的原因,但是显然可能比您在此处拥有的更多。无论如何,我认为问题可能出在您的GetEnumerator方法中。试试:

return audienceList.GetEnumerator;

答案 1 :(得分:1)

所有成员变量都会在页面加载之间被删除,除非您采取措施保留它们(例如将它们存储在ViewState中,或者从会话/数据库中保存/检索它们)。