문제

I am deploying a list using Visual Studio 2010 that is based on a content type I created. The list also uses custom new/edit/display forms whcih I created using SharePoint Designer. I achieve this all as follows:

<?xml version="1.0" encoding="utf-8"?> 
<Elements xmlns="http://schemas.microsoft.com/sharepoint/"> 
    <ContentType ID="0x0100730B35B9AD3755498EF8D60B1E3E0AFE01" 
                 Name="Custom Content Type" 
                 Group="Custom" 
                 Description="" 
                 Inherits="TRUE" 
                 ReadOnly="TRUE" 
                 Version="0"> 
        <FieldRefs> 
            // Code omitted for readability 
        </FieldRefs> 
        <XmlDocuments> 
            <XmlDocument NamespaceURI="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms/url"> 
                <FormUrls xmlns="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms/url"> 
                    <Display>Lists/ListName/CustomDispForm.aspx</Display> 
                    <Edit>Lists/ListName/CustomEditForm.aspx</Edit> 
                    <New>Lists/ListName/CustomNewForm.aspx</New> 
                </FormUrls> 
            </XmlDocument> 
        </XmlDocuments> 
    </ContentType> 
</Elements>

Note the FormUrls section -- this instructs SharePoint to always load the specified form for this content type (as appposed to the default OOTB list forms). See MSDN.

To create my custom forms, I simply created a copy of the OOTB "NewForm.aspx" file and tweaked the layout a little. Nothing drastic.

So far this all works great.

My only problem is that "NewForm.aspx" contains some hardcoded list ID and URL references which I need to replace (with a token?). An example is in the SPDataSource control:

<DataSources>
    <SharePoint:SPDataSource runat="server" DataSourceMode="ListItem" SelectCommand="..." 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://devsite" Name="weburl"></WebPartPages:DataFormParameter>
            <WebPartPages:DataFormParameter ParameterKey="ListID" PropertyName="ParameterValues" DefaultValue="{40047E88-C8E1-4E9B-88E6-2FD75A9D8533}" Name="ListID"></WebPartPages:DataFormParameter>
        </SelectParameters>

What can I replace the hardcoded URL and ListID paramter values with so that my custom form will work with any list that is based on this content type in the future?

도움이 되었습니까?

해결책

It seems you can't use tokens as such, but you can change the default parameters slightly to more reusable ones... e.g:

I changed the WebUrl parameter to:

<WebPartPages:DataFormParameter ParameterKey="weburl" PropertyName="ParameterValues" DefaultValue="/" Name="weburl"></WebPartPages:DataFormParameter> 

And the ListID parameter to:

<WebPartPages:DataFormParameter ParameterKey="ListName" PropertyName="ParameterValues" DefaultValue="Plant Compliance Inspection" Name="ListName"></WebPartPages:DataFormParameter>

As you can see, I have referenced the list by name instead of ID. Admittedly, this does still "hardcode" you to a specific list, but it at least prevents your forms from breaking every time you just re-deploy from Visual Studio (as it blows away your list and recreates it, thus creating a new GUID).

See http://sympmarc.com/2008/12/16/replacing-listids-with-listnames-in-data-view-web-parts/ for more details.

I hope this helps somebody. This stole an entire day out of my life.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 sharepoint.stackexchange
scroll top