ListFormWebPartまたはdataFormWebPartを使用して、アプリケーションページのリストにlistItemを編集または追加しますが、どのように?
-
22-10-2019 - |
質問
私はこのプログラムでlistIDとlistItemid(編集用)に基づいてプログラム的にベースをしたいので、dataformwebpartを使用したい場合は、XSLプロパティを設計モードで設定する必要があります。ランタイムとオブジェクトでターゲットリストのXSLに到達する方法がわかりません。モデル。クエリ文字列のターゲットリストを変更できますが、XSLプロパティが定義されていないため、インターフェイスは変更されません。
<WebPartPages:DataFormWebPart id="dataForm" runat="server" IsIncluded="True" NoDefaultStyle="TRUE"
ViewFlag="8" Title="TestParnian" PageType="PAGE_EDITFORM" ListName="{8965AE3A-CCA0-4502-B7CE-056CD670C016}" Default="FALSE"
DisplayName="TestParnian" __markuptype="vsattributemarkup" __WebPartId="{2CDB3F60-D76F-4410-AEDA-28D9D5815854}">
<DataSources>
<SharePoint:SPDataSource id="TestParnian2" runat="server" DataSourceMode="ListItem" UseInternalName="true"
UseServerDataFormat="True"
selectcommand="<View><Query><Where><Eq><FieldRef Name="ContentType"/><Value Type="Text">مورد</Value></Eq></Where></Query></View>">
<SelectParameters>
<WebPartPages:DataFormParameter Name="ListItemId" ParameterKey="ListItemId"
PropertyName="ParameterValues" DefaultValue="0"/>
<WebPartPages:DataFormParameter Name="ListID"
ParameterKey="ListID" PropertyName="ParameterValues" DefaultValue="{8965AE3A-CCA0-4502-B7CE-056CD670C016}"/>
<WebPartPages:DataFormParameter Name="MaximumRows" ParameterKey="MaximumRows" PropertyName="ParameterValues"
DefaultValue="10"/>
</SelectParameters>
<InsertParameters>
<WebPartPages:DataFormParameter Name="ListItemId" ParameterKey="ListItemId"
PropertyName="ParameterValues" DefaultValue="0"/>
<WebPartPages:DataFormParameter Name="ListID"
ParameterKey="ListID" PropertyName="ParameterValues" DefaultValue="{8965AE3A-CCA0-4502-B7CE-056CD670C016}"/>
</InsertParameters>
<UpdateParameters>
<WebPartPages:DataFormParameter Name="ListItemId" ParameterKey="ListItemId"
PropertyName="ParameterValues" DefaultValue="0"/>
<WebPartPages:DataFormParameter Name="ListID"
ParameterKey="ListID" PropertyName="ParameterValues" DefaultValue="{8965AE3A-CCA0-4502-B7CE-056CD670C016}"/>
</UpdateParameters>
</SharePoint:SPDataSource>
</DataSources>
<ParameterBindings>
<ParameterBinding Name="ListItemId" Location="QueryString(ID)" DefaultValue="0"/>
<ParameterBinding Name="ListID" Location="QueryString(ListID)" DefaultValue="{8965AE3A-CCA0-4502-B7CE-056CD670C016}"/>
<ParameterBinding Name="MaximumRows" Location="None" DefaultValue="10"/>
<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>
<XSL> The XSL Property that needs to be define. </XSL>
</WebPartPages:DataFormWebPart>
したがって、DataFormWebPartは私を助けません。次のオプションはXSLプロパティを必要とせず、このようなオブジェクトモデルでランタイムで作成できるListFormWebPartです。
int itemId = listItem != null ? int.Parse(listItem.ID.ToString()) : -1;
ListFormWebPart lstFormList = new ListFormWebPart();
lstFormList.ListName = lst.ID.ToString("B").ToUpper();
if (itemId != -1)
{
lstFormList.ListItemId = itemId;
lstFormList.PageType = PAGETYPE.PAGE_EDITFORM;
lstFormList.ControlMode = SPControlMode.Edit;
lstFormList.TemplateName = "ListForm";
lstFormList.FormType = 6;
lstFormList.Title = "Edit " + lst.Title;
}
else
{
lstFormList.ControlMode = SPControlMode.New;
lstFormList.PageType = PAGETYPE.PAGE_NEWFORM;
lstFormList.TemplateName = "ListForm";
lstFormList.FormType = 8;
lstFormList.Title = "Add " + lst.Title;
}
lstFormList.ListTitle = lst.Title;
lstFormList.AllowClose = false;
lstFormList.AllowConnect = false;
lstFormList.AllowEdit = false;
lstFormList.AllowZoneChange = true;
lstFormList.EnableViewState = true;
lstFormList.HideIfNoPermissions = true;
Panel1.Controls.Add(lstFormList);
このコードはWebパートでうまく機能しますが、アプリケーションページではうまく機能しません。このWebPartが必要とするすべての名前空間と参照をページに追加したと言わざるを得ません。
これは私にこのエラーを与えてくれます:
System.NullReferenceException:オブジェクト参照は、オブジェクトのインスタンスに設定されていません。 Microsoft.SharePoint.WebPartPages.ListformWebPart.OnPrerender(EventArgs E)at System.web.ui.control.prerenderrecursiveinternal()at system.ui.control.prerenderrecursiveinternal() System.web.ui.control.prerenderrecursiveinternal()at system.web.ui.control.prerenderrecursiveinternal()at System.web.ui.control.prerenderrecursiveinternal()at System.web.ui.control.prenerenderreanderreanderreanderenternal()at System.web.ui.control. .web.ui.control.prerenderrecursiveinternal()at System.web.ui.page.processRequestmain(boolean includestagesbeeasyncpoint、boolean includes afterasyncpoint)
このコードを入れてテストします Page_Init
, Page_Load
と ListFormWebPart_Init
イベントですが、成功しません。 SharePointデザイナーを使用して作成します ListFormWebPart
そして、それをコピーしてアプリケーションページに貼り付けて、必要なアセンブリも追加しますが、成功しません。
何が問題なのかわかりません。私のものがそうでない場合は、正しいアプローチを提供してください。
解決
まず、OOTB Webパートは、SharePointのアプリケーションページで動作するように公式にサポートされていません。私が言われたように、それは公式のMSコースから学ぶことができました 10232.
また、アプリケーションのWebパートにもかかわらず、実際には場合によっては機能しますが、それらには多くの潜在的な問題があります。たとえば、DFWP、DVWP、XLVなどのOOTB XSLT-WEBPARTにXSLLINKを提供すると、キャッシュしようとし、最終的には「存在しなくなったオブジェクトを使用しようとしようとしています」。また、一部のボタンがグレーアウトされている場合、人々は多くの場合、アプリケーションページで標準のWebパートリボン機能に問題があります。
ですから、今日の問題を解決したとしても、明日はカップルを獲得するでしょう。
したがって、基本的に、サイトページを作成し、目的のWebパーツ機能をそこに配置することをお勧めします。また、追加のプログラマティックアクションが必要な場合は、カスタムWebパートを同じページに配置して、必要なものをすべて実行できます。