在SharePoint中,将表单添加到功能中的现有列表中

在SharePoint中,将表单添加到功能中的现有列表中,sharepoint,list,forms,Sharepoint,List,Forms,我需要替换sharepoint网站上现有列表上的视图表单。这必须在特性中完成,并且我不拥有列表的模式,因此我不能简单地更新xml “我的功能”将文件添加到elements.xml中的列表中: <Module Name="Replacement Form" Path="" Url="Lists/ListName"> <File Url="ReplacementDispForm.aspx" /> </Module> 一切正常。问题是在更新功能时-

我需要替换sharepoint网站上现有列表上的视图表单。这必须在特性中完成,并且我不拥有列表的模式,因此我不能简单地更新xml

“我的功能”将文件添加到elements.xml中的列表中:

  <Module Name="Replacement Form" Path="" Url="Lists/ListName">
    <File Url="ReplacementDispForm.aspx" />
  </Module>
一切正常。问题是在更新功能时-由于页面包含一个web部件,升级等会导致页面包含一个额外的web部件-sharepoint只是添加web部件定义,这意味着每次部署都会添加+1个web部件

因此,我试图在功能停用代码中删除该文件,但出现无法删除该文件的简单错误:

string name = "Lists/ListName/ReplacementDispForm.aspx";
SPFile file = web.GetFile(name);
file.Delete();

file.Delete是SPEException“无法删除此文件夹”的错误行。我不确定这是因为文件没有正确添加到列表中,还是我的删除代码不正确?

您的代码看起来不错。我最近也做了类似的事情,但我没有在deactivate中删除文件,而是创建了一个新功能,删除了文件,然后重新激活了第一个功能:

public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
    SPWeb web = properties.Feature.Parent as SPWeb;
    web.Files.Delete("Lists/ListName/ReplacementDispForm.aspx");
    web.Features.Add(new Guid("{E6E82DC3-8802-4332-BD98-0025E0A435F3}"), true);
}
不确定这是否有什么不同,但至少它表明你正在朝着正确的方向前进


对我来说,唯一突出的另一件事就是它本身。默认值可能正在发挥作用,但您可能希望显式地将Type=“Ghostable”添加到File元素。

您也可以从列表中提取schema.xml,即使它不是您自己的。该工具从网站上的任何列表中提取schema.xml

可能不值得,因为您似乎已经完成了创建功能的大部分工作,等等。但是下次您需要做类似的事情

public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
    SPWeb web = properties.Feature.Parent as SPWeb;
    web.Files.Delete("Lists/ListName/ReplacementDispForm.aspx");
    web.Features.Add(new Guid("{E6E82DC3-8802-4332-BD98-0025E0A435F3}"), true);
}