Указанное представление недопустимо при вызове LimitedWebPartManager.AddWebPart в SharePoint 2010.

Этот код работал в WSS 3.0/MOSS 2007 в FeatureReceiver.FeatureActivated:

using (SPLimitedWebPartManager limitedWebPartManager = Site.GetLimitedWebPartManager("default.aspx", PersonalizationScope.Shared)) {
    ListViewWebPart listViewWebPart = new ListViewWebPart {
        Title = title,
        ListName = list.ID.ToString("B").ToUpper(),
        ViewGuid = view.ID.ToString("B").ToUpper()
    };
    limitedWebPartManager.AddWebPart(listViewWebPart, zone, position);
}

Я пытаюсь перейти на SharePoint 2010, и теперь это не удается:

System.ArgumentException: The specified view is invalid.
at Microsoft.SharePoint.SPViewCollection.get_Item(Guid guid)
at Microsoft.SharePoint.WebPartPages.ListViewWebPart.EnsureListAndView(Boolean requireFullBlownViewSchema)
at Microsoft.SharePoint.WebPartPages.ListViewWebPart.get_AppropriateBaseViewId()
at Microsoft.SharePoint.WebPartPages.SPWebPartManager.AddWebPartInternal(SPSupersetWebPart superset, Boolean throwIfLocked)
at Microsoft.SharePoint.WebPartPages.SPLimitedWebPartManager.AddWebPartInternal(WebPart webPart, String zoneId, Int32 zoneIndex, Boolean throwIfLocked)
at Microsoft.SharePoint.WebPartPages.SPLimitedWebPartManager.AddWebPart(WebPart webPart, String zoneId, Int32 zoneIndex)

Интересно, что когда я запускаю его из модульного теста, он работает, он не работает только в FeatureActivated. Когда я отлаживаю с помощью Reflector, он терпит неудачу в этой строке:

this.view = this.list.LightweightViews[new Guid(this.ViewGuid)];

list.LightweightViews возвращает только одно представление, представление по умолчанию, хотя list.Views возвращает их все. При запуске модульного теста LightweightViews возвращает все мои представления. Я понятия не имею, что означает LightweightViews, и у меня заканчиваются идеи. У кого-нибудь еще есть?


person Lee Richardson    schedule 04.05.2010    source источник


Ответы (5)


Чтобы заставить его работать, просто сделайте следующее:

  • Не устанавливайте свойство viewguid объекта listviewwebpart (оставьте его пустым).
  • вызвать метод AddWebpart

Он создаст новый viewguid, связанный с новым скрытым представлением. Затем, если вы хотите настроить это представление, извлеките его из списка и настройте.

person Tonio757    schedule 17.02.2011
comment
Этот вариант также работал для меня: 1. Не устанавливать ViewGuid, 2. AddWebPart, 3. устанавливать ViewGuid, 4. SaveChanges - person jumbo; 21.09.2012

Надеюсь, никто никогда не сталкивался с этой проблемой или даже не видел этот вопрос. В случае неудачи вы получите ту же проблему, у меня нет конкретного решения. В конце концов это только начало работать для меня (через 8 часов). Я могу рассказать вам, что я сделал прямо перед тем, как он начал работать, и, надеюсь, это поможет:

Я вошел через пользовательский интерфейс и установил представление, которое я пытался установить для веб-части представления списка, в качестве представления по умолчанию. Я считаю, что это исправило это, и я понятия не имею, почему.

Некоторые другие замечания по проблеме:

  • Я создаю все свои списки и представления с помощью кода
  • RunWithElevatedPrivileges не помог
  • Создание новой активированной функции SPWeb не помогло
  • Установка ListViewXml = view.HtmlSchemaXml вместо установки ViewGuid не привела к сбою, но представление было неправильным, когда этот код выполнялся в FeatureActivated, но правильным при выполнении в модульном тесте.

Лучшее, что я могу сделать, извините. Если у вас возникла эта проблема, удачи!

person Lee Richardson    schedule 05.05.2010

Прочитав это и это В статье я нашел еще более простое решение. Когда вы добавляете listviewwebpart на любую страницу, веб-часть автоматически создает новое скрытое представление в списке, которое связано с этой веб-частью (вы можете проверить это в SharePoint Manager).
Когда вы переключаете представление для пользовательского интерфейса listviewwebpart throw, он просто получает копию полей из выбранного представления и вставьте его в его скрытое представление.

Все, что вам нужно, это получить это представление по ID, добавить\удалить необходимые поля и обновить представление. Что-то вроде этого:

            var wpMngr = web.GetLimitedWebPartManager(workspaceWeb.Url + "/default.aspx", PersonalizationScope.Shared);
            var attendeeListViewWebPart =
                (ListViewWebPart)wpMngr.WebParts.Cast<WebPart>().FirstOrDefault(w => w.Title == Lists.AttendeesList);
            var list = workspaceWeb.Lists[Lists.AttendeesList];
            var view = list.Views.Cast<SPView>().FirstOrDefault(w => w.ID.ToString("B").Equals(attendeeListViewWebPart.ViewGuid, StringComparison.OrdinalIgnoreCase));
            view.ViewFields.DeleteAll();
            view.ViewFields.Add...
            view.Update();

Согласно статьям, вы не можете обновить свойство ViewGuid для listviewwebpart.

person Kai    schedule 08.04.2011

Я сегодня тоже с этим борюсь.

По каким-то странным причинам предоставленный вами код работает в одних случаях, но не в других.

У меня не было времени исследовать это подробнее, но я могу сказать, что если вы хотите использовать XsltListViewWebPart (который является заменой ListViewWebPart в SharePoint 2010), вы избавитесь от этой надоедливой «ошибки».

Я только что испытал на себе.

Надеюсь, поможет!

person GillouX    schedule 30.01.2012

Я получал ту же ошибку с XsltListViewWebPart:

 Exception: System.ArgumentException: The specified view is invalid.
 at Microsoft.SharePoint.SPViewCollection.get_Item(Guid guid)
 at Microsoft.SharePoint.SPList.GetView(Guid viewGuid)
 at Microsoft.SharePoint.SPList.GetView(String viewGuid)
 at Microsoft.SharePoint.WebPartPages.BaseXsltListWebPart.EnsureView()
 at Microsoft.SharePoint.WebPartPages.BaseXsltListWebPart.get_AppropriateBaseViewId()
 at Microsoft.SharePoint.WebPartPages.SPWebPartManager.AddWebPartInternal(SPSupersetWebPart superset, Boolean throwIfLocked)
 at Microsoft.SharePoint.WebPartPages.SPLimitedWebPartManager.AddWebPartInternal(WebPart webPart, String zoneId, Int32 zoneIndex, Boolean throwIfLocked)
 at Microsoft.SharePoint.WebPartPages.SPLimitedWebPartManager.AddWebPart(WebPart webPart, String zoneId, Int32 zoneIndex)

Поскольку SPList.GetView является открытым методом, Я попробовал это в Powershell, используя Guid из моего нового представления. Это работало нормально.

Я понял, что проблема была в контексте. Я создавал свое представление прямо перед ViewGuid< /а> присваивание. Когда я переместил создание своего представления за пределы SPLimitedWebPartManager код выполнился без ошибок:

SPView view = CreateHiddenView(list);
using (SPLimitedWebPartManager manager = file.GetLimitedWebPartManager(PersonalizationScope.Shared))
{
    try
    {
        XsltListViewWebPart webpart = new XsltListViewWebPart();
        webpart.ListName = list.ID.ToString("B").ToUpperInvariant();
        webpart.TitleUrl = list.DefaultViewUrl;
        webpart.WebId = list.ParentWeb.ID;
        webpart.Title = list.Title;
        webpart.ViewGuid = view.ID.ToString("B").ToUpperInvariant();
        manager.AddWebPart(webpart, "Right", 1);
    }
    finally
    {
        manager.Web.Dispose();
    }
}
person Rich Bennema    schedule 03.05.2012