编辑表单模式下的Sharepoint DataFormWebPart在自定义WebPart

时间:2015-12-26 21:03:02

标签: sharepoint sharepoint-2013 custom-lists dataformwebpart

我需要为自定义共享点列表创建一个编辑表单,该列表显示/允许根据用户配置文件编辑/隐藏某些字段。所以我创建了一个非默认的编辑表单,将其WebPartPages:DataFormWebPart复制到我正在开发的自定义webpart解决方案,并通过一些调整将其部署到sharepoint(querystring参数重命名为SPID而不是ID,因为webpart用于一个页面库并使用ID作为参数给了我各种错误)

现在这个程序可以很好地用于“新表格”,将数据保存到下一个屏幕......所有的桃子。

我尝试使用编辑表单执行相同的过程,稍微定制了XSL(没有什么花哨的样式和HTML表格改组),当我加载页面时,我惊讶地看到绑定工作正常,我的所有字段都有他们的值。但是当我点击保存它会做一点回发并且所有字段都被重置为空值并且在检查之后没有保存任何值。

此时为了隔离问题我删除了所有自定义项与编辑表单页面和我正在使用的自定义webpart的唯一不同之处是ListItemId位置,我将querysting param从“ID”更改为“SPID” ”

有什么我应该知道的,我显然不会在自定义webpart中运行WebPartPages:DataFormWebPart吗?令人费解的是插入表单有效,编辑表单显示所有值(绑定OK)但不保存任何内容

当然,错误日志没有我可以找到的痕迹,我没有JavaScript错误(即开发人员工具调试)

任何指针都会非常感激。

PS:Sharepoint 2013 on prem。 PS2:这是我的webpart的标记:

    <WebPartPages:DataFormWebPart runat="server" EnableOriginalValue="False" DisplayName="New Projects" ViewFlag="8" ViewContentTypeId="" Default="FALSE"
                        ListUrl="" ListDisplayName="" ListName="{5A1F5F46-E308-440D-A7CE-3FF0587D9B4B}" ListId="5a1f5f46-e308-440d-a7ce-3ff0587d9b4b" PageType="PAGE_EDITFORM"
                        PageSize="-1" UseSQLDataSourcePaging="True" DataSourceID="" ShowWithSampleData="False" AsyncRefresh="False" ManualRefresh="False" AutoRefresh="False"
                        AutoRefreshInterval="60" NoDefaultStyle="TRUE" InitialAsyncDataFetch="False" Title="New Projects" FrameType="None" SuppressWebPartChrome="False"
                        Description="" IsIncluded="True" PartOrder="2" FrameState="Normal" AllowRemove="True" AllowZoneChange="True" AllowMinimize="True" AllowConnect="True"
                        AllowEdit="True" AllowHide="True" IsVisible="True" DetailLink="" HelpLink="" HelpMode="Modeless" Dir="Default" PartImageSmall=""
                        MissingAssembly="Cannot import this Web Part." PartImageLarge="" IsIncludedFilter="" ExportControlledProperties="True"
                        ConnectionID="00000000-0000-0000-0000-000000000000" ID="Project_DataFormWebPart" ChromeType="None" ExportMode="All" __MarkupType="vsattributemarkup"
                        __WebPartId="{C30D3C9F-ECB9-4334-B442-5244C9837488}" __AllowXSLTEditing="true" WebPart="true" Height="" Width="" >
                        <DataSources>
                            <SharePoint:SPDataSource ID="Project_DataSource" runat="server" DataSourceMode="ListItem"
                                SelectCommand = "&lt;View&gt;&lt;Query&gt;&lt;Where&gt;&lt;And&gt;&lt;Eq&gt;&lt;FieldRef Name=&quot;ContentType&quot;/&gt;&lt;Value Type=&quot;Text&quot;&gt;Item&lt;/Value&gt;&lt;/Eq&gt;&lt;Eq&gt;&lt;FieldRef Name=&quot;ID&quot;/&gt;&lt;Value Type=&quot;Number&quot;&gt;{ListItemId}&lt;/Value&gt;&lt;/Eq&gt;&lt;/And&gt;&lt;/Where&gt;&lt;/Query&gt;&lt;/View&gt;"
                                UseInternalName="True" UseServerDataFormat="True">
                                <SelectParameters>
                                    <WebPartPages:DataFormParameter ParameterKey="ListItemId" PropertyName="ParameterValues" DefaultValue="0" Name="ListItemId"></WebPartPages:DataFormParameter>
                                    <WebPartPages:DataFormParameter ParameterKey="weburl" PropertyName="ParameterValues" DefaultValue="http://jam3iya4" Name="weburl"></WebPartPages:DataFormParameter>
                                    <WebPartPages:DataFormParameter ParameterKey="ListID" PropertyName="ParameterValues" DefaultValue="{5A1F5F46-E308-440D-A7CE-3FF0587D9B4B}" Name="ListID"></WebPartPages:DataFormParameter>
                                </SelectParameters>
                                <UpdateParameters>
                                    <WebPartPages:DataFormParameter ParameterKey="ListItemId" PropertyName="ParameterValues" DefaultValue="0" Name="ListItemId"></WebPartPages:DataFormParameter>
                                    <WebPartPages:DataFormParameter ParameterKey="weburl" PropertyName="ParameterValues" DefaultValue="http://jam3iya4" Name="weburl"></WebPartPages:DataFormParameter>
                                    <WebPartPages:DataFormParameter ParameterKey="ListID" PropertyName="ParameterValues" DefaultValue="{5A1F5F46-E308-440D-A7CE-3FF0587D9B4B}" Name="ListID"></WebPartPages:DataFormParameter>
                                </UpdateParameters>
                            </SharePoint:SPDataSource>
                        </DataSources>
                        <Xsl>
                            <xsl:stylesheet xmlns:x="http://www.w3.org/2001/XMLSchema" xmlns:dsp="http://schemas.microsoft.com/sharepoint/dsp" version="1.0" exclude-result-prefixes="xsl msxsl ddwrt" xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime" xmlns:asp="http://schemas.microsoft.com/ASPNET/20" xmlns:__designer="http://schemas.microsoft.com/WebParts/v2/DataView/designer" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:SharePoint="Microsoft.SharePoint.WebControls" xmlns:ddwrt2="urn:frontpage:internal">
                                <xsl:output method="html" indent="no"/>
                                <xsl:decimal-format NaN=""/>
                                <xsl:param name="ListItemId"></xsl:param>
                                <xsl:param name="dvt_apos">&apos;</xsl:param>
                                <xsl:param name="ManualRefresh"></xsl:param>
                                <xsl:variable name="dvt_1_automode">0</xsl:variable>
                                <xsl:template match="/" xmlns:x="http://www.w3.org/2001/XMLSchema" xmlns:dsp="http://schemas.microsoft.com/sharepoint/dsp" xmlns:asp="http://schemas.microsoft.com/ASPNET/20" xmlns:__designer="http://schemas.microsoft.com/WebParts/v2/DataView/designer" xmlns:SharePoint="Microsoft.SharePoint.WebControls">
                                    <xsl:choose>
                                        <xsl:when test="($ManualRefresh = 'True')">
                                            <table width="100%" border="0" cellpadding="0" cellspacing="0">
                                                <tr>
                                                    <td valign="top">
                                                        <xsl:call-template name="dvt_1"/>
                                                    </td>
                                                    <td width="1%" class="ms-vb" valign="top">
                                                        <img src="/_layouts/15/images/staticrefresh.gif" id="ManualRefresh" border="0" onclick="javascript: {ddwrt:GenFireServerEvent('__cancel')}" alt="Click here to refresh the dataview."/>
                                                    </td>
                                                </tr>
                                            </table>
                                        </xsl:when>
                                        <xsl:otherwise>
                                            <xsl:call-template name="dvt_1"/>
                                        </xsl:otherwise>
                                    </xsl:choose>
                                </xsl:template>
                                <xsl:template name="dvt_1">
                                    <xsl:variable name="dvt_StyleName">ListForm</xsl:variable>
                                    <xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row[@ID=$ListItemId]"/>
                                    <div>
                                        <span id="part1">
                                            <table cellpadding="4" cellspacing="0" border="0">
                                            <caption style="color:red;">{{<xsl:value-of select="$ListItemId"/>}}</caption>
                                                <tr>             
                                                    <td class="ms-vh">
                                                    <table border="0" width="100%">
                                                        <xsl:call-template name="dvt_1.body">
                                                            <xsl:with-param name="Rows" select="$Rows"/>
                                                        </xsl:call-template>
                                                    </table>                        
                                                    </td>
                                                </tr>
                                            </table>
                                        </span>
                                        <SharePoint:AttachmentUpload runat="server" ControlMode="Edit"/>
                                        <SharePoint:ItemHiddenVersion runat="server" ControlMode="Edit"/>
                                    </div>
                                </xsl:template>
                                <xsl:template name="dvt_1.body">
                                    <xsl:param name="Rows"/>
                                    <tr>
                                        <td class="ms-toolbar" nowrap="nowrap">
                                            <table>
                                                <tr>
                                                    <td width="99%" class="ms-toolbar" nowrap="nowrap"><IMG SRC="/_layouts/15/images/blank.gif" width="1" height="18"/></td>
                                                    <td class="ms-toolbar" nowrap="nowrap">
                                                        <SharePoint:SaveButton runat="server" ControlMode="Edit" id="savebutton1"/>
                                                        <input type="button" value=" Ok " name="btnTopSave" onclick="javascript:{ddwrt:GenFireServerEvent('__commit')}" style="height:22px"/>
                                                    </td>
                                                </tr>
                                            </table>
                                        </td>
                                    </tr>
                                    <tr>
                                        <td class="ms-toolbar" nowrap="nowrap">
                                            <SharePoint:ItemValidationFailedMessage runat="server" ControlMode="Edit"/>
                                        </td>
                                    </tr>
                                    <xsl:for-each select="$Rows">
                                        <xsl:call-template name="dvt_1.rowedit"/>
                                    </xsl:for-each>
                                    <tr>
                                        <td class="ms-toolbar" nowrap="nowrap">
                                            <table>
                                                <tr>
                                                    <td class="ms-descriptiontext" nowrap="nowrap">
                                                        <SharePoint:CreatedModifiedInfo ControlMode="Edit" runat="server"/>
                                                    </td>
                                                    <td width="99%" class="ms-toolbar" nowrap="nowrap"><IMG SRC="/_layouts/15/images/blank.gif" width="1" height="18"/></td>
                                                    <td class="ms-toolbar" nowrap="nowrap">
                                                        <SharePoint:SaveButton runat="server" ControlMode="Edit" id="savebutton2"/>
                                                    </td>
                                                </tr>
                                            </table>
                                        </td>
                                    </tr>
                                </xsl:template>
                                <xsl:template name="dvt_1.rowedit">
                                    <xsl:param name="Pos" select="position()"/>
                                    <tr>
                                        <td>
                                            <xsl:if test="$dvt_1_automode = '1'" ddwrt:cf_ignore="1">
                                                    <span ddwrt:amkeyfield="ID" ddwrt:amkeyvalue="ddwrt:EscapeDelims(string(@ID))" ddwrt:ammode="view"></span>
                                            </xsl:if>                                
                                            <table cellpadding="4" cellspacing="0" border="0">
                                                <tr>        
                                                    <th class="ms-vh SmallHeader">Created</th>          
                                                    <th class="ms-vh SmallHeader">Quote</th>
                                                    <th class="ms-vh SmallHeader">RFQ Manager</th>
                                                    <th class="ms-vh SmallHeader">Assigned To</th>
                                                    <th class="ms-vh SmallHeader">Value</th>
                                                    <th class="ms-vh SmallHeader">Status</th>
                                                </tr>        
                                                  <tr valign="middle">                        
                                                      <td class="ms-vb2"><SharePoint:FormField runat="server" id="fff2{$Pos}" ControlMode="Display" FieldName="Created" __designer:bind="{ddwrt:DataBind('u',concat('fff2',$Pos),'Value','ValueChanged','ID',ddwrt:EscapeDelims(string(@ID)),'@Created')}"/></td>           
                                                      <td class="ms-vb2" id="QNContrainer"><SharePoint:FormField runat="server" id="fff10{$Pos}" ControlMode="Display" FieldName="Quote_x0020__x0023_" __designer:bind="{ddwrt:DataBind('u',concat('fff10',$Pos),'Value','ValueChanged','ID',ddwrt:EscapeDelims(string(@ID)),'@Quote_x0020__x0023_')}"/></td>
                                                      <td class="ms-vb-user"><SharePoint:FormField runat="server" id="fff5{$Pos}" ControlMode="Display" FieldName="Account_x0020_Manager" __designer:bind="{ddwrt:DataBind('u',concat('fff5',$Pos),'Value','ValueChanged','ID',ddwrt:EscapeDelims(string(@ID)),'@Account_x0020_Manager')}"/></td>
                                                      <td class="ms-vb-user"><SharePoint:FormField runat="server" id="fff7{$Pos}" ControlMode="Display" FieldName="Assigned_x0020_To" __designer:bind="{ddwrt:DataBind('u',concat('fff7',$Pos),'Value','ValueChanged','ID',ddwrt:EscapeDelims(string(@ID)),'@Assigned_x0020_To')}"/></td>
                                                      <td class="ms-vb2" style="color:#F15854;"><SharePoint:FormField runat="server" id="fff12{$Pos}" ControlMode="Display" FieldName="Quote_x0020_Value" __designer:bind="{ddwrt:DataBind('u',concat('fff12',$Pos),'Value','ValueChanged','ID',ddwrt:EscapeDelims(string(@ID)),'@Quote_x0020_Value')}"/></td>
                                                      <td class="ms-vb2"><SharePoint:FormField runat="server" id="fff14{$Pos}" ControlMode="Display" FieldName="Status" __designer:bind="{ddwrt:DataBind('u',concat('fff14',$Pos),'Value','ValueChanged','ID',ddwrt:EscapeDelims(string(@ID)),'@Status')}"/></td>
                                                  </tr>
                                                <tr>  
                                                    <td colspan="6">
                                                        <div id="Tabs">
                                                            <ul>
                                                                <li id="RFQTab">
                                                                <a href="#RFQ">
                                                                    <span>RFQ</span>
                                                                </a>
                                                                </li>
                                                            </ul>
                                                            <div id="RFQ">
                                                                <table border="0" cellspacing="0" cellpadding="4" width="100%">
                                                                    <tr>
                                                                        <td colspan="2" class="ms-formlabel">
                                                                            <H3 class="ms-standardheader">
                                                                            <nobr>
                                                                                Project Name<span class="ms-formvalidation"> *</span>
                                                                            </nobr>
                                                                            </H3>
                                                                        </td>
                                                                    </tr>
                                                                    <tr>
                                                                        <td colspan="2" class="ms-formbody longField">
                                                                            <span style="color:red;">{{<xsl:value-of select="@ID"/>}}</span>
                                                                            <SharePoint:FormField runat="server" id="ff1{$Pos}" ControlMode="Edit" FieldName="Title" __designer:bind="{ddwrt:DataBind('u',concat('ff1',$Pos),'Value','ValueChanged','ID',ddwrt:EscapeDelims(string(@ID)),'@Title')}"/>
                                                                            <SharePoint:FieldDescription runat="server" id="ff1description{$Pos}" FieldName="Title" ControlMode="Edit"/>
                                                                        </td>
                                                                    </tr>

[此处使用相同语法的多行字段,为清晰起见而删除]

                                                                </table>
                                                            </div>
                                                        </div>
                                                    </td>
                                                </tr>  
                                            </table>
                                            <br/>
                                        </td>
                                    </tr>
                                </xsl:template>
                            </xsl:stylesheet>
                        </Xsl>
                        <DataFields>@Title,Project Name;@Product,Product;@Customer,Customer;@Account_x0020_Manager,Account Manager;@emailOptions,emailOptions;@Assigned_x0020_To,Assigned To;@Lead,Lead;@Quickship,Quickship;@Status,Status;@Notes,Notes;@ID,ID;@ContentType,Content Type;@Modified,Modified;@Created,Created;@Author,Created By;@Editor,Modified By;@_UIVersionString,Version;@Attachments,Attachments;@ItemChildCount,Item Child Count;@FolderChildCount,Folder Child Count;</DataFields>
                        <ParameterBindings>
                             <ParameterBinding Name="ListItemId" Location="QueryString(SPID)" DefaultValue="0"/>
                             <ParameterBinding Name="weburl" Location="None" DefaultValue="http://jam3iya4"/>
                             <ParameterBinding Name="ListID" Location="None" DefaultValue="{5A1F5F46-E308-440D-A7CE-3FF0587D9B4B}"/>
                             <ParameterBinding Name="dvt_apos" Location="Postback;Connection"/>
                             <ParameterBinding Name="ManualRefresh" Location="WPProperty[ManualRefresh]"/>
                             <ParameterBinding Name="UserID" Location="CAMLVariable" DefaultValue="CurrentUserName"/>
                             <ParameterBinding Name="Today" Location="CAMLVariable" DefaultValue="CurrentDate"/>
                        </ParameterBindings>
                    </WebPartPages:DataFormWebPart>

1 个答案:

答案 0 :(得分:0)

好吧所以我设法解决了这个问题,希望这可以帮助那些面临同样问题的人。事实证明(这只是实验,我会喜欢比我确认更精明的人),在自定义webpart中使用DataFormWebPart是可行的。只是不在自定义用户控件(.ascx)中 当我使用visual studio创建我的visual webpart时,它创建了第一个用户控件,它被添加到webpart中,按惯例,我会将所有控件放在那里,包括DataFormWebPart。这是一个很好的插入形式,它可以完美地工作,保存数据并继续重定向。 当处于编辑形式时,它会正确显示,但保存时触发的事件将完全保存并且字段会重置。 解决方法是

  1. 在sharepoint设计器中为您需要编辑的列表创建一个编辑表单。
  2. 然后在浏览器中导航到该表单并编辑该页面(在浏览器中)
  3. 使用其中的表单编辑webpart并将其导出。
  4. 现在webpart文件只是一个xml文件,其中包含DataFormWebPart的所有属性列表。您可以在visual studio中导入此文件
  5. xsl或绑定的任何自定义都可以在此文件中完成(我使用xsllink路由并链接到我保留在站点资产中的外部xsl文件)
  6. 虽然将此webpart包含到您的项目中,但不要将其添加到ascx文件中,只需在webpart .cs中以编程方式加载它(作为您的用户控件的兄弟姐妹而不是孩子)
  7. 这是可选的,我创建了一个继承DataFormWebPart并将其与此webpart关联的类,因此我可以以编程方式操作某些属性并在构造函数中传递一些启动参数,但实际上......您不必我只是有礼貌
  8. 此时您的编辑表单功能齐全,您可以编辑并保存自定义webpart中的内容,如果您小心将列表guids放在参数等中,则可以在不同服务器上重复使用webpart
  9. 花了我一段时间,到目前为止,我不确定为什么DataFormWebPart在ascx中时出现了无声错误,但是嘿,我没有得到我生命中的那几天,所以不妨用它来体验和#34 ;乐趣&#34;与sharepoint

    欢呼:)