【问题标题】:SharePoint 2010 Web controls - LookupField value not being set on postbackSharePoint 2010 Web 控件 - 回发时未设置 LookupField 值
【发布时间】:2011-09-10 03:08:53
【问题描述】:

我在 VS2010 中创建了一个自定义编辑表单作为简单的 aspx 页面(继承自 LayoutsPageBase),它使用 SharePoint Web 控件 LookupField 控件来显示来自自定义类型的值的下拉列表

表单正确显示,下拉框包含预期的值范围

ControlMode 设置为与 FormContext 相同(尽管我已尝试将其显式设置为 Edit)

但在回发时,下拉列表的值未设置 - 所选项目索引设置为 -1

如何正确使用 LookupField 控件从用户那里获取选定的值?

可能是因为我在 aspx 中以声明方式添加控件,然后在页面加载事件中从 SPContext 设置列表 ID 等? - 参见下面的代码 sn-p(不是最漂亮的,只是试图让它在这一点上工作):

来自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 中以声明性方式完成这一切?

【问题讨论】:

  • 好像回发是在重新绑定列表,可以发代码吗?

标签: sharepoint sharepoint-2010


【解决方案1】:

在回发期间,如果未填充列表控件,则从列表中选择的值将被忽略。因此,如果您选择第 2 项并且列表项为 null,它将简单地忽略响应参数并且不设置 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";  
    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 2011-10-10
    • 2013-06-02
    • 1970-01-01
    相关资源
    最近更新 更多