在功能升级中我必须在列表视图中添加一个字段,该字段将指向内容类型中的新列。
目前我的代码基于视图标题为所有链接的假设(我通过调试器得到它)。所以它是片段:
SPView view;
try
{
view = list.Views["All Links"];
}
catch
{
view = list.Views[0]; // just in case
}
view.ViewFields.Add("NewField");
view.Update();
现在它可以工作,但假设视图的标题是所有链接(或者只有一个视图[0])。我没有在schema.xml中找到标题,也没有在其他地方找到。在代码中更新视图的最佳安全方法是什么? (或者可能有更好的方法来更新它,例如使用XML,但据我所知,当功能升级时,我不会考虑升级schema.xml文件。)
谢谢,帕维尔
答案 0 :(得分:1)
要在schema.xml中查找视图的默认标题,请查看相应View element的DisplayName属性。如果属性值是“所有链接”,那么你可以没事。
如果在开箱即用的链接列表定义的情况下,值类似于$Resources:core,All_Links;
,则需要考虑更多内容。如果您的网站只有英文版,那么您仍然可以搜索“所有链接”。但是如果你有其他语言网站,你需要做这样的事情:
string title = SPUtility.GetLocalizedString(
"$Resources:All_Links;",
"core",
web.Language);
SPView view = list.Views[title];
现在,即使属性值为“所有链接”或所有网站都是英文,仍然有可能(特别是在升级事件中)标题已从默认值更改。在这些情况下,我更喜欢按BaseViewID进行搜索。不幸的是,BaseViewID
没有索引器,所以我使用以下代码:
private SPView GetView(SPList list, string id)
{
SPView view = null;
foreach (SPView v in list.Views)
{
if (id == v.BaseViewID)
{
view = v;
break;
}
}
return view;
}
答案 1 :(得分:0)
检索视图的另一种方法是使用SPWeb.GetViewFromUrl("Lists/{List_Name}/{View_Name}.aspx")
,参见msdn article
然后您的代码看起来像这样(如果您的功能是Web范围的):
SPWeb web = (SPWeb)properties.Feature.Parent;
SPView view = web.GetViewFromUrl("Lists/<List_Name>/All Links.aspx");
view.ViewFields.Add("NewField");
view.Update();