Sharepoint DataFormWebPart in Edit Form mode not saving when used inside a custom WebPart

2k views Asked by At

I have a requirement to create an edit form for a custom sharepoint list that displays/allows edit/hides certain fields based on the user profile. So I created a non-default edit form, copied its WebPartPages:DataFormWebPart to a custom webpart solution I'm developing and deployed it to sharepoint with a little bit of tweaking (querystring parameter renamed to SPID instead of ID because the webpart is used in a page library and using ID as a param was giving me all sorts of errors)

Now this procedure worked beautifully for a "New Form", saves the data moves to the next screen ... All peachy.

I tried the same process with an edit form, customized the XSL a bit (nothing fancy just styling and HTML tables shuffling) and to my surprise when I load the page I can see the binding working fine and all my fields have their values. But when I hit save it does a little postback and all the fields get reset to empty values and after checking none of the values got saved.

At this point to isolate the problem I've removed all customizations the only thing different from the edit form page and the custom webpart I'm using is the ListItemId location where I changed the querysting param from "ID" to "SPID".

Is there anything I should know that I obviously don't about running WebPartPages:DataFormWebPart within a custom webpart? It's puzzling that the insert form works and the edit form is showing all the values (binding OK) but not saving anything

And of course the error logs have no trace of this that I can find and I have no JavaScript errors (i.e. developer tools debugging)

Any pointers would be much appreciated.

PS: Sharepoint 2013 on prem. PS2:here's the markup for my 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>

[ many rows of fields with the same syntax here, removed for clarity ]

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

There are 1 answers

0
user5719350 On

ok so i managed to fix this problem hopefully this can help someone else who is facing the same issue. it turns out (and again this is just experimental i would love for someone more savvy than i am to confirm this) that using a DataFormWebPart inside a custom webpart IS doable. just not inside a custom user control (.ascx) when i created my visual webpart with visual studio it created a first user control that is added to the webpart and by habit i would put all my controls in there including the DataFormWebPart. this is fine with an insert form it works flawlessly, saving the data and proceeding with a redirect. when in edit form it displays properly but the events fired when saving don't save at all and the fields get reset. the solution to this is

  1. create an edit form in sharepoint designer for the list you need to edit.
  2. then navigate to that form in your browser and edit that page (in the browser)
  3. edit the webpart with the form in it and export it.
  4. now that webpart file is just one xml file with the list of all the properties for the DataFormWebPart. this file you can import in visual studio
  5. any customizations to the xsl or the bindings can be done here in this file (i went the xsllink route and linked to an external xsl file i keep in site assets)
  6. while including this webpart to your project don't add it to the ascx file, just load it programatically in the webpart .cs (as a sibling to your user controls not a child)
  7. this is optional, i created a class that inherits DataFormWebPart and associated it with this webpart so i can manipulate some of the properties programatically and pass some initiation parameters in the constructor but really ... you don't have to i was just being polite
  8. at this point your edit form is fully functional and you can edit and save your stuff from your custom webpart, and if you are careful in placing your list guids in the parameters etc you can reuse the webpart across different servers

took me a while and to this date i am unsure why the silent error when DataFormWebPart is inside an ascx but hey i am not getting those couple of days of my life back so may as well chalk it to experience and "fun" with sharepoint

cheers :)