C# 值是自定义控件内回发时的空字符串
我有一个自定义控件,它有一个隐藏字段。回发时,我想获取存储在其中的值,但它始终是一个空字符串。有什么想法吗 我正在执行客户端对隐藏字段值的操作,并在firebug中验证了字段是否正确,然后发布回发 以下是设置:C# 值是自定义控件内回发时的空字符串,c#,asp.net,custom-controls,C#,Asp.net,Custom Controls,我有一个自定义控件,它有一个隐藏字段。回发时,我想获取存储在其中的值,但它始终是一个空字符串。有什么想法吗 我正在执行客户端对隐藏字段值的操作,并在firebug中验证了字段是否正确,然后发布回发 以下是设置: public class DualListPanel : SWebControl, INamingContainer { protected IList<DlpItem> UnassignedList { get; set; } p
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服务器端将反映这些更改(假设它读取要赋值的标记)?如果是这样的话,那么是否有一种不同的方法来识别服务器端的价值呢?我将对此进行讨论。有没有解释为什么这样做有效?将它们更改为受保护,但仍然无法使用。我进入了调试模式,并确保它们是空字符串。这只是一次尝试,因为我在手动声明控件时遇到了问题。受保护的东西只用于访问标记和代码隐藏中的控件。。。