在Feature Upgrading中添加字段到列表视图 - 如何识别列表视图

时间:2012-03-26 18:27:56

标签: sharepoint sharepoint-2010 sharepoint-api

在功能升级中我必须在列表视图中添加一个字段,该字段将指向内容类型中的新列。

目前我的代码基于视图标题为所有链接的假设(我通过调试器得到它)。所以它是片段:

                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文件。)

谢谢,帕维尔

2 个答案:

答案 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();