我已经在VS2010中创建了一个自定义编辑表单(继承自LayoutsPageBase),该页面使用SharePoint Web控件LookupField控件显示自定义类型的值下拉列表
使用包含预期值范围的下拉框正确显示表单
ControlMode设置为与FormContext相同(尽管我已尝试将其设置为“编辑”)
但是在回发中没有设置下拉列表的值 - 所选项目索引设置为-1
如何正确使用LookupField控件从用户捕获选定的值?
可能是因为我在aspx中明确地添加控件,然后在页面加载事件中从SPContext设置列表ID等吗? - 请参阅下面的代码段(不是最漂亮但只是试图让它在此时工作):
来自aspx:
<SharePoint:FileField ID="FileNameText" InputFieldLabel="Name" runat="server" ControlMode="Display"/><br />
<SharePoint:LookupField ID="FeedType" runat="server" />
<SharePoint:TextField ID="FeedStatus" runat="server" />
...
在代码隐藏页面加载:
if (!IsPostBack)
{
SPItem feedFileItem = SPContext.Current.Item;
FileNameText.ControlMode = SPContext.Current.FormContext.FormMode;
FileNameText.ListId = SPContext.Current.ListId;
FileNameText.ItemId = SPContext.Current.ItemId;
FileNameText.FieldName = "Name";
FeedType.ControlMode = SPControlMode.Edit;
FeedType.ListId = SPContext.Current.ListId;
FeedType.ItemId = SPContext.Current.ItemId;
FeedType.FieldName = "FeedType";
FeedStatus.ItemContext = SPContext.Current;
FeedStatus.RenderContext = SPContext.Current;
FeedStatus.ControlMode = SPControlMode.Edit;
FeedStatus.ListId = SPContext.Current.ListId;
FeedStatus.ItemId = SPContext.Current.ItemId;
FeedStatus.FieldName = "FeedStatus";
}
更新
好的,我设法通过在CreateChildControls的覆盖中添加代码中的控件来使我的表单工作 - 这与我在网上看到的大多数样本一致。
但有人可以解释为什么我的方法不起作用以及我是否可以在aspx中以声明的方式完成所有这些工作?
答案 0 :(得分:2)
在回发期间,如果未填充列表控件,则会忽略列表中的选定值。因此,如果您选择第2项并且列表项为空,则它将忽略响应参数而不设置Value属性。这是因为ProcessPostData发生在LoadData之前。即使您要删除LoadData方法上的!IsPostBack,它仍然无法工作,因为ProcessPostData仍然在LoadData之前发生,并且您在处理回发之前没有加载列表。
解决此问题的一种简单方法是将初始化代码移动到应用程序页面的EnsureChildControls方法中。
protected override void EnsureChildControls()
{
base.EnsureChildControls();
...
FeedType.ControlMode = SPControlMode.Edit;
FeedType.ListId = SPContext.Current.ListId;
FeedType.ItemId = SPContext.Current.ItemId;
FeedType.FieldName = "FeedType";
...
}