Добавить поле в представление списка внутри FeatureUpgrading - как идентифицировать представление списка - PullRequest
0 голосов
/ 26 марта 2012

при обновлении функции Мне нужно добавить поле в список, которое будет указывать на новый столбец в типе контента.

В настоящее время мой код основан на предположении, что заголовок представления имеет вид Все ссылки (я получил его через отладчик). Так что это фрагмент:

                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 не учитывается).

Спасибо, Pawel

Ответы [ 2 ]

1 голос
/ 27 марта 2012

Чтобы найти заголовок представления по умолчанию внутри schema.xml, посмотрите на атрибут DisplayName соответствующего элемента View . Если значением атрибута является «Все ссылки», то у вас все будет в порядке.

Если, как и в случае с определением списка ссылок «из коробки», это значение равно $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;
}
0 голосов
/ 14 сентября 2012

Другой способ восстановить ваш вид - использовать SPWeb.GetViewFromUrl("Lists/{List_Name}/{View_Name}.aspx"), ср. Статья MSDN

Тогда ваш код будет выглядеть примерно так (если ваша функция ограничена Web):

SPWeb web = (SPWeb)properties.Feature.Parent;    
SPView view = web.GetViewFromUrl("Lists/<List_Name>/All Links.aspx");
view.ViewFields.Add("NewField"); 
view.Update();
...