代码之家  ›  专栏  ›  技术社区  ›  Rich Bennema

当controlMode=display时,如何将ListFieldIterator指向子网站?

  •  0
  • Rich Bennema  · 技术社区  · 15 年前

    我有一个自定义页面,其中包含以下内容 ListFieldIterator :

    <SharePoint:ListFieldIterator runat="server" ControlMode="Display" OnInit="listFieldIterator_Init" />
    

    以下是初始化事件:

        protected void listFieldIterator_Init(object sender, EventArgs e)
        {
            ListFieldIterator listFieldIterator = sender as ListFieldIterator;
            SPContext current = SPContext.Current;
            SPFieldUrlValue value = new SPFieldUrlValue(current.ListItem[SPBuiltInFieldId.URL].ToString());
            Uri uri = new Uri(value.Url);
            using (SPWeb web = current.Site.OpenWeb(uri.AbsolutePath))
            {
                SPListItem item = web.GetListItem(uri.PathAndQuery);
                if (null != item)
                {
                    listFieldIterator.ItemContext = SPContext.GetContext(this.Context, item.ID, item.ParentList.ID, web);
                }
            }
        }
    

    如果目标列表项与页面位于同一个站点,则一切工作正常。但一旦它指向不同的站点,所有字段都会显示,但所有值都以以下格式显示:

    未能呈现“标题”列 因为“单曲”中的一个错误 “文本行”字段类型控件。见 日志中的详细信息。异常消息: 列表不存在您的页面 所选内容包含一个不包含 存在。可能已被删除 其他用户..

    如果我将控制模式更改为编辑,值将正确显示。那么,在显示模式下如何让它工作呢?

    1 回复  |  直到 15 年前
        1
  •  2
  •   Rich Bennema    15 年前

    我做了更多的研究 here , here here . 最后两个引导我创建以下自定义控件,该控件在显示模式下正确呈现ListFieldIterator:

    public class RecursiveListFieldIterator : ListFieldIterator
    {
        protected override void Render(System.Web.UI.HtmlTextWriter output)
        {
            SPWeb web = SPControl.GetContextWeb(this.Context);
            SPControl.SetContextWeb(this.Context, this.ItemContext.Web);
            base.Render(output);
            SPControl.SetContextWeb(this.Context, web);
        }
    }