2012-03-26 4 views
0

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

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

   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

ответ

1

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

Если, как в случае с неправильным определением списка ссылок, значение составляет примерно $Resources:core,All_Links;, то есть еще о чем подумать. Если ваши сайты только на английском языке, вы все равно сможете найти «Все ссылки». Но если у вас есть другие сайты языка, вам нужно будет сделать что-то вроде этого:

string title = SPUtility.GetLocalizedString(
    "$Resources:All_Links;", 
    "core", 
    web.Language); 
SPView view = list.Views[title]; 

Теперь, даже если значение атрибута «Все ссылки» или если все сайты на английском языке, есть еще возможность (особенно в событии Upgrading), что название было изменено со значения по умолчанию. В таких случаях я предпочитаю искать по 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

Другой способ получить Ваше мнение с помощью 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();