Как я могу получить идентификатор списка для ListFormWebPart в моей пользовательской форме редактирования? - PullRequest
0 голосов
/ 31 января 2012

У меня есть очень простая пользовательская форма редактирования, aspx с кодом позади. Это прямая копия стандартной формы редактирования с некоторыми дополнительными javascript. Я открыл это с дизайнером (ург) и скопировал это сразу. Проблема в том, что ListFormWebPart нужен идентификатор списка , который я пытаюсь получить без какой-либо удачи.

Это не даст мне отладки, и я в основном задаюсь вопросом, полностью ли я отключен и должен ли я подойти к этому по-другому или я упускаю что-то критическое?

<WebPartPages:WebPartZone runat="server" FrameType="None" ID="Main" Title="loc:Main"><ZoneTemplate>
    <WebPartPages:ListFormWebPart ID="ListFormWebPart" runat="server" __MarkupType="xmlmarkup" WebPart="true" __WebPartId="{B1433CAB-755A-4E8C-A35E-629AD2C5BB67}" >
        <WebPart xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.microsoft.com/WebPart/v2">
          <Title>Dokument</Title>
          <FrameType>Default</FrameType>
          <Description />
          <IsIncluded>true</IsIncluded>
          <PartOrder>2</PartOrder>
          <FrameState>Normal</FrameState>
          <Height />
          <Width />
          <AllowRemove>true</AllowRemove>
          <AllowZoneChange>true</AllowZoneChange>
          <AllowMinimize>true</AllowMinimize>
          <AllowConnect>true</AllowConnect>
          <AllowEdit>true</AllowEdit>
          <AllowHide>true</AllowHide>
          <IsVisible>true</IsVisible>
          <DetailLink />
          <HelpLink />
          <HelpMode>Modeless</HelpMode>
          <Dir>Default</Dir>
          <PartImageSmall />
          <MissingAssembly>Cannot import this Web Part.</MissingAssembly>
          <PartImageLarge />
          <IsIncludedFilter />
          <ExportControlledProperties>true</ExportControlledProperties>
          <ConnectionID>00000000-0000-0000-0000-000000000000</ConnectionID>
          <ID>g_b1433cab_755a_4e8c_a35e_629ad2c5bb67</ID>

          <ListName xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm"> <%=ListId%> </ListName>
          <ListId xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm"> <%=ListId%> </ListId>

          <PageType xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">PAGE_EDITFORM</PageType>
          <FormType xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">6</FormType>
          <ControlMode xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">Edit</ControlMode>
          <ViewFlag xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">1048576</ViewFlag>
          <ViewFlags xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">Default</ViewFlags>
          <ListItemId xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm">0</ListItemId>
        </WebPart>
    </WebPartPages:ListFormWebPart>
</ZoneTemplate></WebPartPages:WebPartZone>

А вот небольшой код:

public partial class RKEditForm : LayoutsPageBase
{
    public string ListId { get; set; }

    protected void Page_Load(object sender, EventArgs e)
    {
        Debugger.Launch();
        ListId = Request.QueryString["List"];
        if (string.IsNullOrEmpty(ListId))
        {
            ListId = "123";
        }
    }
}

и это запрос, который отправляет sharepoint: (взято в uls)

Name=Request (GET:http://rkdhs-a:80/_layouts/RK.Dhs/RKEditForm.aspx?List=12cfe831%2D9c9d%2D4393%2D85dc%2Dd522440035ca&ID=4&Source=http%3A%2F%2Frkdhs%2Da%2FDokument%2FForms%2FAllItems%2Easpx&RootFolder=%2FDokument&ContentTypeId=0x01010053E1D612BA3F4E21AA250ECD751942B3004C051FA1C7EDB047A5DE0AABD0672600&IsDlg=1)

и я продолжаю получать это исключение:

System.FormatException: Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).   
 at System.Guid..ctor(String g)    
 at Microsoft.SharePoint.WebPartPages.ListFormWebPart.get_ItemContext()    
 at Microsoft.SharePoint.WebPartPages.ListFormWebPart.EnsureList()    
 at Microsoft.SharePoint.WebPartPages.ListFormWebPart.EnsureListAndForm()    
 at Microsoft.SharePoint.WebPartPages.ListFormWebPart.UseLegacyForm()    
 at Microsoft.SharePoint.WebPartPages.ListFormWebPart.CreateChildControls()    
 at System.Web.UI.Control.EnsureChildControls()    
 at System.Web.UI.WebControls.WebParts.Part.get_Controls()    
 at System.Web.UI.Control.SetRenderMethodDelegate(RenderMethod renderMethod)    
 at ASP._layouts_rk_dhs_rkeditform_aspx.__BuildControlListFormWebPart()    
 at ASP._layouts_rk_dhs_rkeditform_aspx.__BuildControl__control24(Control __ctrl)    
 at System.Web.UI.WebControls.WebParts.WebPartZone.GetInitialWebParts()    
 at System.Web.UI.WebControls.WebParts.WebPartManager.RegisterZone(WebZone zone)    
 at System.Web.UI.WebControls.WebParts.WebPartZone.OnInit(EventArgs e)    
 at Microsoft.SharePoint.WebPartPages.WebPartZone.OnInit(EventArgs e)    
 at System.Web.UI.Control.InitRecursive(Control namingContainer)    
 at System.Web.UI.Control.InitRecursive(Control namingContainer)    
 at System.Web.UI.Control.InitRecursive(Control namingContainer)    
 at System.Web.UI.Control.InitRecursive(Control namingContainer)    
 at System.Web.UI.Control.InitRecursive(Control namingContainer)    
 at System.Web.UI.Control.InitRecursive(Control namingContainer)    
 at System.Web.UI.Control.InitRecursive(Control namingContainer)    
 at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Ответы [ 3 ]

2 голосов
/ 01 февраля 2012

Решил это во многих испытаниях, немного смазки для локтей, и, к счастью, наткнулся на этот сайт: http://blogs.sharepointdam.com/jen/archive/2009/10/12/custom-list-forms-with-code-behind.aspx

В основном добавлено OnInit = "Lfwp_OnInit" к определению веб-части, удалено

<WebPartPages:ListFormWebPart ID="ListFormWebPart1" OnInit="Lfwp_OnInit" webpart="true" runat="server" __WebPartId="{51C3F707-B5E4-408B-9ED8-9AA8C394ADB6}">

удалил эти:

<ListName xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm"> <%=ListId%> </ListName>
<ListId xmlns="http://schemas.microsoft.com/WebPart/v2/ListForm"> <%=ListId%> </ListId>

и добавил это в мой код:

protected void Lfwp_OnInit(object sender, EventArgs e)
    {
        string listId = Page.Request.QueryString["List"];
        string itemId = Page.Request.QueryString["ID"];

        ListFormWebPart lfwp = (ListFormWebPart)sender;
        lfwp.ListName = listId;
        lfwp.ListItemId = Convert.ToInt32(itemId);
    }

Джен (блог, который я разместил) описал проблему и хорошо ее решилс:

Так в чем же проблема?ListFormWebPart - это невероятно гибкий инструмент программирования, который может отображаться на лету автоматически, в зависимости от того, какой список, тип содержимого и столбцы должны отображаться, НО он не извлекает ListName и ListItemId из Page.REQUEST автоматически.Хорошо, мы можем сделать это с помощью выделенного кода, но это НЕ проблема ;-) Проблема в том, что элемент управления недоступен во время события OnPreInit для установки этих свойств, и до того, как обработчик события OnInit сработает, SharePoint уже выбрасываетисключение, указывающее, что для указанного списка и элемента itemId не найдено ни одного элемента ... Да!Что ж, решение на самом деле (как и большинство вещей в жизни) тривиально: событие OnInit срабатывает на элементы управления, прежде чем оно запускается для страницы.Поэтому важно добавить обработчик событий code-behind не только на уровне страницы, но и для самой веб-части:

Мне удалось установить ListID внутри aspx, используя следующую строку:но ListName не сработает .. пробовал все виды кастингов, конвертов и трюков, но безуспешно, поэтому в итоге я остановился на решении с выделенным кодом.

<% ListFormWebPart.ListId = new Guid(Request.QueryString["List"]) %>
<% ListFormWebPart.ListName = Request.QueryString["List"] %>
0 голосов
/ 31 января 2012

ListViewWebPart ожидает GUID, и вы даете ему трехзначное число. Вы пытаетесь передать идентификатор предмета? Идентификатор списка будет выглядеть примерно так: {880B8CC4-A1C4-47F9-BCBB-A04C615BA4BE}

Попробуйте получить параметр запроса List со страницы настроек списка какого-либо списка, чтобы убедиться, что у вас есть правильный GUID (иногда даже придирчивы к наличию фигурных скобок).

0 голосов
/ 31 января 2012

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

String DecodedListId = Server.UrlDecode(ListId);
...