«Указанное недопустимое представление» при вызове LimitedWebPartManager.AddWebPart в SharePoint 2010 - PullRequest
9 голосов
/ 04 мая 2010

Этот код используется для работы в WSS 3.0 / MOSS 2007 в FeatureReceiver.FeatureActivation:

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)

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

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

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

Ответы [ 5 ]

6 голосов
/ 18 февраля 2011

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

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

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

3 голосов
/ 05 мая 2010

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

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

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

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

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

1 голос
/ 03 мая 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();
    }
}
1 голос
/ 30 января 2012

Я боролся с этим и сегодня.

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

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

Я только что проверил себя.

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

1 голос
/ 08 апреля 2011

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

Все, что вам нужно, это получить это представление по идентификатору, добавить \ удалить необходимые поля и обновить представление. Примерно так:

            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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...