Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 值是自定义控件内回发时的空字符串_C#_Asp.net_Custom Controls - Fatal编程技术网

C# 值是自定义控件内回发时的空字符串

C# 值是自定义控件内回发时的空字符串,c#,asp.net,custom-controls,C#,Asp.net,Custom Controls,我有一个自定义控件,它有一个隐藏字段。回发时,我想获取存储在其中的值,但它始终是一个空字符串。有什么想法吗 我正在执行客户端对隐藏字段值的操作,并在firebug中验证了字段是否正确,然后发布回发 以下是设置: public class DualListPanel : SWebControl, INamingContainer { protected IList<DlpItem> UnassignedList { get; set; } p

我有一个自定义控件,它有一个隐藏字段。回发时,我想获取存储在其中的值,但它始终是一个空字符串。有什么想法吗

我正在执行客户端对隐藏字段值的操作,并在firebug中验证了字段是否正确,然后发布回发

以下是设置:

public class DualListPanel : SWebControl, INamingContainer

    {

        protected IList<DlpItem> UnassignedList { get; set; }
        protected IList<DlpItem> AssignedList { get; set; }
        private HiddenField assignedItemsField, unassignedItemsField;

        public DualListPanel()
        {
            CssClass = "DualListPanel";
            EnableViewState = true;
        }

        #region ViewState

        protected override void LoadViewState(object savedState)
        {
            var state = savedState as object[];
            UnassignedList =   state[0] as List<DlpItem>;
            AssignedList = state[1] as List<DlpItem>;
            base.LoadViewState(state[2]);
        }

        protected override object SaveViewState()
        {
            object[] state = new object[3];
            state[0] = UnassignedList;
            state[1] = AssignedList;
            state[2] = base.SaveViewState();
            return state;
        }

        #endregion

        #region WebControl Overrides


        protected override void OnInit(EventArgs e)
        {
            EnsureChildControls();
            GetUnassignedList(); //omitted method
            GetAssignedList(); //omitted method
            base.OnInit(e);
        }

        protected override void CreateChildControls()
        {          
            assignedItemsField = new HiddenField();
            assignedItemsField.ID = "HiddenAssignedItems";
            assignedItemsField.EnableViewState = true;

            unassignedItemsField = new HiddenField();
            unassignedItemsField.ID = "HiddenUnassignedItems";
            unassignedItemsField.EnableViewState = true;

            Controls.Add(assignedItemsField);
            Controls.Add(unassignedItemsField);
            base.CreateChildControls();
        }

        #endregion

        #region Item Lists Retrieval

        public string GetCommaDelimUnassignedItems()
        {
            return unassignedItemsField.Value;
        }

        public string GetCommaDelimAssignedItems()
        {
            return assignedItemsField.Value;
        }

        #endregion
    }
公共类DualListPanel:SWebControl,INamingContainer
{
受保护的IList UnassignedList{get;set;}
受保护的IList AssignedList{get;set;}
私有HiddenField assignedItemsField、unassignedItemsField;
公共列表面板()
{
CssClass=“DualListPanel”;
EnableViewState=true;
}
#区域视图状态
受保护的覆盖无效LoadViewState(对象保存状态)
{
var state=savedState作为对象[];
UnassignedList=状态[0]为列表;
AssignedList=状态[1]为列表;
base.LoadViewState(状态[2]);
}
受保护的覆盖对象SaveViewState()
{
对象[]状态=新对象[3];
状态[0]=未分配列表;
状态[1]=已分配列表;
state[2]=base.SaveViewState();
返回状态;
}
#端区
#区域网络控制覆盖
受保护的覆盖无效OnInit(事件参数e)
{
ensureChildControl();
GetUnassignedList();//省略的方法
GetAssignedList();//省略的方法
碱基.奥尼特(e);
}
受保护的覆盖无效CreateChildControls()
{          
assignedItemsField=新的HiddenField();
assignedItemsField.ID=“HiddenAssignedItems”;
assignedItemsField.EnableViewState=true;
unassignedItemsField=new HiddenField();
unassignedItemsField.ID=“hiddenuassigneditems”;
unassignedItemsField.EnableViewState=true;
控件。添加(assignedItemsField);
控件。添加(unassignedItemsField);
base.CreateChildControls();
}
#端区
#区域项目列表检索
公共字符串GetCommaDelimUnassignedItems()
{
返回unassignedItemsField.Value;
}
公共字符串GetCommaDelimAssignedItems()
{
返回assignedItemsField.Value;
}
#端区
}

看起来您只需要标记两个隐藏字段
受保护
,而不是
私有

Ugggh我省略了有用的信息。我主要是测试我是否可以在页面循环过程中访问这些值。不一定来自页面调用 GetCommaDelimUnassignedItems()


我意识到我已经实现了OnInit(),并调用它来检查值(我忽略了它,认为它对这个问题没有用处)。完全忘记了在OnInit()期间不会加载ViewState。我将它改为OnPreRender(),现在工作正常了

我认为隐藏字段的值在回发过程中不会丢失, 在初始化隐藏字段时,将代码放入Ispostback

protected override void CreateChildControls()         
{                      
 if(!ispostback){
 assignedItemsField = new HiddenField();     
 assignedItemsField.ID = "HiddenAssignedItems";
 assignedItemsField.EnableViewState = true;          
 unassignedItemsField = new HiddenField();           
 unassignedItemsField.ID = "HiddenUnassignedItems"; 
 unassignedItemsField.EnableViewState = true;      
 Controls.Add(assignedItemsField);             
 Controls.Add(unassignedItemsField);          
 base.CreateChildControls();      
}
 }

是否可能没有直接关系,如果我更改标记客户端,HiddenField服务器端将反映这些更改(假设它读取要赋值的标记)?如果是这样的话,那么是否有一种不同的方法来识别服务器端的价值呢?我将对此进行讨论。有没有解释为什么这样做有效?将它们更改为受保护,但仍然无法使用。我进入了调试模式,并确保它们是空字符串。这只是一次尝试,因为我在手动声明控件时遇到了问题。受保护的东西只用于访问标记和代码隐藏中的控件。。。