【问题标题】:Default OOBX EditForm disappeared for a SharePoint document librarySharePoint 文档库的默认 OOBX EditForm 消失
【发布时间】:2020-05-31 01:54:56
【问题描述】:

SharePoint 文档库的默认 OOBX EditForm 消失。我们尝试在 SharePoint 设计器中创建新的编辑表单,但出现无法将列表更改保存到服务器的错误。 然后尝试另一种方法,转到所有文件/文档库/表单 - 这里出现 list view threshold 错误。我们库中有超过 1 万个项目,无法打开表单文件夹。

请告知如何取回默认的编辑表单。

【问题讨论】:

    标签: sharepoint


    【解决方案1】:

    您需要通过 PowerShell 来完成:

    $webpartTemplate = @"
    <WebPart xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/WebPart/v2">
        <Assembly>Microsoft.SharePoint, Version=16.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Assembly>  
        <TypeName>Microsoft.SharePoint.WebPartPages.ListFormWebPart</TypeName>
        <ListName xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">{{{LIST_ID}}}</ListName>
        <ListId xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">{{LIST_ID}}</ListId>
        <PageType xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">{{PAGE_TYPE}}</PageType>
        <FormType xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">{{FORM_TYPE}}</FormType>
        <ControlMode xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">{{CONTROL_MODE}}</ControlMode>
        <ViewFlag xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">1048576</ViewFlag>
        <ViewFlags xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">Default</ViewFlags>
        <ListItemId xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">0</ListItemId>
    </WebPart>
    "@
    
    Function Create-DefaultListForm
    {
        param(
            [parameter(Mandatory=$true)]$List, 
            [parameter(Mandatory=$true)][string]$FormUrl, 
            [parameter(Mandatory=$true)][ValidateSet("Display", "Edit", "New")]$FormType
        )
    
        begin { }    
        process
        {
    
            $webpartXml = $webpartTemplate -replace "{{LIST_ID}}", $List.Id.ToString()
    
            switch ($FormType)
            {
                "Display" { 
                    $webpartXml = $webpartXml -replace "{{PAGE_TYPE}}", "PAGE_DISPLAYFORM" 
                    $webpartXml = $webpartXml -replace "{{FORM_TYPE}}", "4"  
                    $webpartXml = $webpartXml -replace "{{CONTROL_MODE}}", "Display"  
                    break;
                }
                "Edit" { 
                    $webpartXml = $webpartXml -replace "{{PAGE_TYPE}}", "PAGE_EDITFORM" 
                    $webpartXml = $webpartXml -replace "{{FORM_TYPE}}", "6"  
                    $webpartXml = $webpartXml -replace "{{CONTROL_MODE}}", "Edit"  
                    break;
                }
                "New" { 
                    $webpartXml = $webpartXml -replace "{{PAGE_TYPE}}", "PAGE_NEWFORM" 
                    $webpartXml = $webpartXml -replace "{{FORM_TYPE}}", "8"  
                    $webpartXml = $webpartXml -replace "{{CONTROL_MODE}}", "New"  
                    break;
                }
            }
    
            try
            {           
                #Check if form page already exists
                $listPages = Get-PnPProperty -ClientObject $List.RootFolder -Property Files
                $formPage = $listPages | Where-Object { $_.ServerRelativeUrl.ToLower() -eq $FormUrl.ToLower() }
    
                if ($null -eq $formPage) {
                    Write-Output "  [Creating Form Page] $FormUrl"
    
                    #Create Form
                    Remove-PnPFile -ServerRelativeUrl $FormUrl -Force
                    $formPage = $List.RootFolder.Files.AddTemplateFile($FormUrl, [Microsoft.SharePoint.Client.TemplateFileType]::FormPage)            
                }
                else {
                    #Form page exists, check if form is recognized by list (i.e. form page has a form webpart on it)
                    $listForms = Get-PnPProperty -ClientObject $List -Property Forms
    
                    if ($null -ne $listForms -and $listForms.Count -gt 0) {
                        $existingForm = $list.Forms | Where-Object { $_.ServerRelativeUrl.ToLower() -eq $FormUrl.ToLower() }
                        if ($null -ne $existingForm) {
                            Write-Warning "  [Form Already Exists] $FormUrl"
                            return;
                        }                
                    }
                }
    
                Write-Output "  [Adding Form Webpart] $FormUrl"
                #Get Webpart Manager for Form
                $wpm = $formPage.GetLimitedWebPartManager([Microsoft.SharePoint.Client.WebParts.PersonalizationScope]::Shared)
    
                #Import Webpart on page
                $wp = $wpm.ImportWebPart($webpartXml)
    
                #Add webpart to Form
                $wpm.AddWebPart($wp.WebPart, "Main", 1) | Out-Null
    
                #Execute changes
                $List.Context.ExecuteQuery()                    
            }
            catch
            {
                Write-Error "Error creating form $FormType at $FormUrl. Error: $($_.Exception)"
            }
        }
        end { }
    }
    

    使用类似这样的脚本。如果你只需要恢复EditForm,那么你显然可以跳过下面的Upload、New和DispForms:

        Connect-PnPOnline -Url $problemSiteUrl -UseWebLogin
        $list = Get-PnPList $problemlistTitle
        $listUrl = $list.RootFolder.ServerRelativeUrl
    
        # Handle Document Library Types
        if ($list.BaseType -eq [Microsoft.SharePoint.Client.BaseType]::DocumentLibrary) {
            Write-Host " > Processing Library: $listUrl"
            Create-DefaultListForm -List $list -FormUrl "$listUrl/Forms/Upload.aspx"   -FormType New
            Create-DefaultListForm -List $list -FormUrl "$listUrl/Forms/DispForm.aspx" -FormType Display
            Create-DefaultListForm -List $list -FormUrl "$listUrl/Forms/EditForm.aspx" -FormType Edit
        }
    
        # Handle Generic List Types
        else {
            Write-Host " > Processing List: $listUrl"
            Create-DefaultListForm -List $list -FormUrl "$listUrl/NewForm.aspx"  -FormType New
            Create-DefaultListForm -List $list -FormUrl "$listUrl/DispForm.aspx" -FormType Display
            Create-DefaultListForm -List $list -FormUrl "$listUrl/EditForm.aspx" -FormType Edit
        }
    

    如果您只需要编辑表单,请像这样使用Create-DefaultListForm 函数:

        Connect-PnPOnline -Url 'UrlOfProblemSite' -UseWebLogin
        $list = Get-PnPList 'TitleOfTheProblemLibraryHere'
        $listUrl = $list.RootFolder.ServerRelativeUrl
    
        Create-DefaultListForm -List $list -FormUrl "$listUrl/Forms/EditForm.aspx" -FormType Edit
    

    【讨论】:

    • 非常感谢!!我只需要EditForm。我需要输入的Page_Type、Form_Type、Control_Mode是什么? 1048576 是一个我不应该改变的常数?
    • 是的,这是指定内置表单类型的常量。如果您在 Create-DefaultListForm 函数中看到 switch 语句,它会为您计算出值。如果您只需要编辑表单,那么只需像这样调用函数Create-DefaultListForm -List $list -FormUrl "$listUrl/Forms/EditForm.aspx" -FormType Edit
    • 我们在 ListName 中使用了“{5CA...2DC7A }”,在 ListID 中使用了“5CA...2DC7A”。继续获取未设置对象引用到未指定对象的实例:(:) NullReferenceException
    • 您不需要直接担心 ID,使用 $webpartTemplate 定义的占位符就像在我的帖子中一样,不要自己替换这些值,以及 Create-DefaultListForm 的定义,然后像我的最后一个示例一样调用该函数。
    • 感谢您的快速回复。我们使用的是 SharePoint 2013,版本应该是 15..0.0.0?我们创建了一个测试文档库来运行脚本来创建一个编辑表单。如果我们不提供列表名称和列表 ID,脚本会知道创建 Editform 的文档库吗?对于 $listUrl/Forms/EditForm.aspx,我们可以使用唯一的名称,例如 $listUrl/Forms/EditForm10.aspx?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多