如何在自定义编辑表单上检索ListFormWebPart的列表ID?

时间:2012-01-31 10:19:37

标签: asp.net sharepoint-2010 web-parts code-behind

我有一个非常基本的自定义编辑表单,一个带有代码的aspx。它是标准编辑表单的直接副本,带有一些额外的javascripts。 我和设计师(urgh)打开了它并直接复制了它。 问题是ListFormWebPart需要列表ID ,我试图在没有运气的情况下获取。

它不会让我调试,我基本上想知道我是否完全关闭并且应该采用不同的方法,或者我错过了一些关键的东西?

<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 个答案:

答案 0 :(得分:2)

解决了很多试验一些肘部油脂,幸运地在这个网站上磕磕绊绊: http://blogs.sharepointdam.com/jen/archive/2009/10/12/custom-list-forms-with-code-behind.aspx

基本上将 OnInit =“Lfwp_OnInit”添加到webpart定义中,已删除

<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);
    }
Jen(我发布的博客)描述了这个问题并且很好地解决了这个问题:

  

那么,问题出在哪里? ListFormWebPart非常灵活   可以在飞行中渲染自己的编程艺术作品   自动,具体取决于列表,内容类型和列   显示,但它不检索ListName和ListItemId   从Page.REQUEST自动。好吧,我们可以做到这一点   代码隐藏,但那不是问题;-)问题在于   在OnPreInit事件期间,控件不可用于设置这些控件   属性,并在OnInit事件处理程序被触发SharePoint之前   已经抛出一个异常,说明找不到任何项目   列表和itemId指定... Duhh!   嗯,解决方案实际上(就像生活中的大多数事情一样)是微不足道的:   OnInit事件在触发页面之前触发控件。   因此,不仅要添加代码隐藏事件处理程序也很重要   在页面级别,但也为Web部件本身:

我确实设法使用以下行在aspx中设置ListID,但ListName不起作用..尝试了各种类型的转换,转换和技巧但没有成功,所以最后我决定代码 - 解决方案背后。

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

答案 1 :(得分:0)

我不能代表您的其余代码或您要做的事情,但您可能需要解码列表ID以进一步采用此方法。

String DecodedListId = Server.UrlDecode(ListId);

答案 2 :(得分:-1)

ListViewWebPart需要一个GUID,你给它一个三位数字。您是否尝试传递商品ID?列表ID如下所示:{880B8CC4-A1C4-47F9-BCBB-A04C615BA4BE}

尝试从某些列表的列表设置页面中获取List查询参数,以确保您拥有正确的GUID(有时候对于使用花括号也很挑剔)。