Search code examples
asp.netsharepoint-2010web-partscode-behind

How can i retrieve the List ID for the ListFormWebPart on my custom edit form?


I have a very basic custom edit form, an aspx with code behind. It is a direct copy of the standard edit form with some additional javascripts. I opened it up with designer(urgh) and copied it straight off. Problem is that the ListFormWebPart needs the list id, which i'm trying to fetch without any luck.

It won't let me debug and i'm basically wondering if i'm totally off and should approach this differently or am i missing something critical?

<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>

And here is the small code behind:

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";
        }
    }
}

and this is the request that sharepoint sends: (picked up in 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)

and i keep getting this exception:

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)

Solution

  • Solved it with alot of trials some elbow grease and after luckily stumbling across this site: http://blogs.sharepointdam.com/jen/archive/2009/10/12/custom-list-forms-with-code-behind.aspx

    Basically added OnInit="Lfwp_OnInit" to the webpart definition, removed

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

    removed these:

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

    and added this to my code-behind:

    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);
        }
    

    Jen(the blog i posted) described the issue and sol well with:

    So, where's the problem? The ListFormWebPart is an incredibly flexible piece of programming art that can render itself on the fly automatically, depending on what list, content type and columns are to be displayed, BUT it does not retrieve the ListName and ListItemId from the Page.REQUEST automatically. Alright, we can do that with the code-behind, but that's NOT the problem ;-) The problem is that the control isn't available during the OnPreInit event to set these properties, and before the OnInit event handler gets fired SharePoint already throws an exception stating that no item could be found for the list and itemId specified ...Duhh! Well, the solution is actually (as most things in life) trivial: the OnInit event fires on the controls before it fires for the page. Therefore it is important to add a code-behind event handler not only at the page level but also for the Web Part itself:

    I did manage to set the ListID inside the aspx using the following line, but the ListName wouldn't work.. tried all sorts of castings, converts and tricks but with no success so in the end i settled for the code-behind solution.

    <% ListFormWebPart.ListId = new Guid(Request.QueryString["List"]) %>
    <% ListFormWebPart.ListName = Request.QueryString["List"] %>