操作ボタンはサーバーが登録した操作を実行します。カスタムAPI、カスタムアクション、Dataverseのメッセージ、またはあなたのコードのいずれかで、登録されたユーザーにのみ表示されます。ボタンはサーバーにサインインしたユーザーが実行可能な操作を一度だけ尋ね、送信するレコードをユーザーが行う可能性のある操作と照合するため、サーバーが拒否するようなものを提供しません。サーバーは送信時にすべてのリクエストを判断します。
サーバーの Program.csに操作を登録します:Dataverse操作の場合は AddOperationAccess 、 AddOperationHandler は自分のコードです。 AddPortalRole内で、 WithOperationAccess と WithOperationHandler は役割の保持者に1つずつ付与します。登録は、誰が操作を実行できるか、リクエストが持つパラメータ、指すべきレコード、そして返ってくる出力を規定します。
// Program.cs (the server)
// 請求権の持ち主が請求書上で変更できるカスタムAPIです
builder.Services.AddPortalRole("Billing", role => role
.WithOperationAccess("ppp_IssueRefund", o => o
.OnRecord("Target", TableSecurityPermission.Write)
.AcceptingParameters("Amount")
.ReturningOutputs("RefundId")));
// サインインしているユーザーのために、あなた自身のコードで、彼らが読むかもしれない引用文を掲載してください
builder.Services.AddOperationHandler<SendQuoteHandler>("SendQuote", o => o
.ForSignedInUsers()
.OnRecord("Quote", TableSecurityPermission.Read)
.ReturningOutputs("SentTo"));
public sealed class SendQuoteHandler(IQuoteMailer mailer) : IPortalOperationHandler
{
public async Task<IReadOnlyDictionary<string, ColumnValueBase?>?> ExecuteAsync(
PortalOperationContext context, CancellationToken cancellationToken)
{
var quote = context.GetParameter<LookupValue>("Quote")!;
var sentTo = await mailer.SendAsync(quote.Value!.Value, cancellationToken);
return new Dictionary<string, ColumnValueBase?> { ["SentTo"] = new StringValue { Value = sentTo } };
}
}
ForEveryone()、 ForSignedInUsers()、 ForContactsMatching(fetchXml) 、 ForWebRoles(...) が誰が実行できるかを決めています。ロールの登録はその役割の保有者のためのものです。Dataverseネイティブセキュリティの下では、連絡先はポータルロールではなくウェブロールを保持し、実行権限を持つセキュリティロールを持つユーザーのみがカスタムAPIを提供します。操作が属する場所には OperationButton を入れ、演算名とその記録に入るパラメータを付けます。
<RecordContext table="invoice" queryParameterName="id">
<OperationButton
operation="ppp_IssueRefund"
recordParameter="Target"
label="Issue refund"
icon={<Money20Regular />}
confirmationMessage="Issue a refund for this invoice?"
getParameters={askForAmount}
onCompleted={({ outputs }) => showRefund(outputs.RefundId)}
/>
</RecordContext><RecordContext TableName="invoice" QueryParameterName="id">
<OperationButton Operation="ppp_IssueRefund"
RecordParameter="Target"
Label="Issue refund"
Icon="@(new Icons.Regular.Size20.Money())"
ConfirmationMessage="Issue a refund for this invoice?"
GetParametersAsync="AskForAmountAsync"
OnCompleted="ShowRefund" />
</RecordContext>WhenNotAllowed (whenNotAllowed)を設定して代わりに無効にします。回答は一度だけ求められ、アプリが開いている間に保持されます。サーバーが拒否したリクエストは再度求められます。RecordParameterに入ります: Record、参照による任意の記録、または保存された後はボタンが入っている RecordContext の記録です。ユーザーは登録の要求に応じてその記録に対応できなければなりません。フォームのレコードにはユーザーが何をできるかが記され、参照名付きのレコードが読み取られます。Parameters はすべてのリクエストに送信され、 GetParametersAsync (getParameters)はボタンをクリックすると、例えばダイアログからさらに多くを集めます。何も返さないとクリックはキャンセルされます。 ConfirmationMessage は操作を実行する前に尋ね、 OnCompleted は出力を返します。Label 内容やアイコン、ツールチップ、見た目を他のボタンと同じように設定してください。デモは数行のコードが全員の操作として登録されます。名前を入力してボタンをクリックすると、サーバーが応答し、ページが挨拶を書きます。
グリッドのツールバーでは、 OperationGridButton 選択された各行に対して一度だけ操作を実行し、その行を RecordParameterに送信し、その後グリッドを更新します。選択されたすべての行がユーザーが行動可能な行であり、各行がそれ自体を示している間に有効化されます。Dataverse操作のリクエストは1つのトランザクションで送信されるため、すべて実行するか、実行しないかのどちらかです。自分のコードは一度に1行ずつ動作し、失敗した最初の行で停止します。
<MainGrid tableName="invoice">
<GridToolbarItems>
<OperationGridButton
operation="ppp_ApproveInvoice"
recordParameter="Target"
label="Approve"
whenNotAllowed="disable"
/>
</GridToolbarItems>
</MainGrid><MainGrid TableName="invoice">
<ToolbarItems>
<OperationGridButton Operation="ppp_ApproveInvoice"
RecordParameter="Target"
Label="Approve"
WhenNotAllowed="OperationButtonBehavior.Disable" />
</ToolbarItems>
</MainGrid>いくつかのアカウントを選択して「チェック」をクリックします。デモのコードがそれぞれを読み取り、その名前に答えます。承認は訪問者が保持していないポータルロールにのみ付与されるため、無効と表示されます。
アカウント名
アカウント名 会社名や事業名を入力してください。 | 口座番号 口座番号 アカウントのID番号やコードを入力して、システムビューで素早く検索・特定できます。 | メイン電話 メイン電話 このアカウントのメイン電話番号を入力してください。 | 住所1:市 住所1:市 プライマリー住所には市名を入力してください。 | 年間収入 年間収入 財務パフォーマンス分析の指標として使われる口座の年間収益を入力します。 | 一次接触 一次接触 アカウントの主要な連絡先を選択して、連絡先情報に素早くアクセスできるようにします。 | |
|---|---|---|---|---|---|---|
| Abernathy - MacGyver | KTWSLQHY | (491) 600-8029 | Tampa | $15,959,059.84 | Bradford Kiehn | |
| Abshire - Marks | 4EBO9F42 | (432) 879-3107 | Boston | $14,635,260.82 | Archibald Bailey | |
| Adams - Torphy | K6VNNUCN | (864) 842-2566 | Annapolis | $4,567,299.55 | Merle Vandervort | |
| Altenwerth, D'Amore and Mante | F9MN5BAZ | (125) 048-0015 | Gulfport | $3,839,082.81 | Heidi Reichel | |
| Ankunding and Sons | 92P2G0SF | (603) 147-5429 | Fargo | $32,724,448.89 | Fatima White | |
| Balistreri, Heller and Murphy | 3Y0AF481 | (909) 808-9886 | New Haven | $7,097,756.35 | Angie Kreiger | |
| Balistreri, Steuber and Schultz | FF5RCGXG | (435) 761-0052 | Hattiesburg | $35,943,517.75 | Jake Bogisich | |
| Bartoletti LLC | JBQ0L2O8 | (292) 573-7498 | Santa Fe | $766,813.66 | Cecil Sipes | |
| Bartoletti, Ratke and Beatty | WZIDG7K2 | (267) 075-5978 | Portland | $32,338,459.84 | Tabitha Morissette | |
| Barton, Koepp and Cronin | TGAL5Y8F | (821) 885-8434 | Norman | $43,550,293.98 | Marc Dibbert | |
| Bashirian - Hamill | ZS1XZLDL | (792) 135-0145 | Baltimore | $15,916,182.51 | Alexie Dach | |
| Bashirian - Weber | OC5PYOJC | (492) 789-5504 | Cranston | $23,269,960.31 | Emmet Krajcik | |
| Baumbach and Sons | X8V8TZRX | (670) 937-4364 | Ann Arbor | $4,319,879.33 | Charity Sawayn | |
| Baumbach, Maggio and Turner | V24ZA492 | (509) 251-9848 | Orlando | $25,479,745.81 | Cali McClure | |
| Beahan Inc | B9XXSIJM | (262) 429-4179 | Sioux Falls | $45,854,197.84 | Tressa Graham | |
| Berge and Sons | WO8OIGR6 | (165) 108-8947 | Topeka | $40,560,550.52 | Delphine Jerde | |
| Bergnaum Group | T3KB03RE | (381) 148-7032 | Rapid City | $32,406,150.23 | Dakota Ward | |
| Bergstrom and Sons | G99XNRDY | (182) 902-0206 | Casper | $48,880,601.83 | Grant Funk | |
| Bergstrom, Bins and Flatley | J1TXPJ9I | (409) 160-0657 | Pittsburgh | $21,005,421.54 | Blanche Gulgowski | |
| Blanda - Terry | 4L8RSVL9 | (190) 468-0033 | Vancouver | $33,567,160.56 | Fausto Pagac | |
| Bode LLC | F5IR66HK | (386) 496-6921 | Detroit | $1,800,033.15 | Kane Pollich | |
| Bogisich, Mitchell and Balistreri | PCVDL8PS | (267) 567-6606 | Manchester | $10,336,491.66 | Esperanza Luettgen | |
| Borer - Mohr | LHI1SSVO | (070) 539-8404 | Providence | $36,092,236.14 | Emelia Murray | |
| Botsford - Baumbach | 8JZK18K6 | (389) 188-6100 | Cranston | $318,662.34 | Maria Runte | |
| Botsford, Schroeder and Kassulke | U39NNCOJ | (960) 101-3753 | Sacramento | $19,016,940.28 | Raphael Bergnaum | |
| Boyer - Schaefer | EFJQXML0 | (473) 115-3249 | Fort Wayne | $48,601,111.30 | Moses Metz | |
| Boyle, Zulauf and Lakin | XXRF6GXU | (028) 071-4090 | Helena | $31,856,728.91 | Federico Hamill | |
| Brekke LLC | UCLPTB19 | (795) 385-0349 | Norman | $25,296,518.98 | Noemie Stracke | |
| Brekke, Feeney and Johns | VMGNL1M7 | (203) 861-9656 | Charleston | $13,632,447.58 | Kristin Koch | |
| Brown, Rohan and Mayer | EMOSYGOI | (479) 235-6497 | Fairbanks | $49,780,735.02 | Phoebe Legros | |
| Cassin, Kassulke and Schaefer | 5KSSVNW7 | (852) 978-3789 | Flagstaff | $29,260,487.45 | Dedrick Thiel | |
| Christiansen - Metz | GSZJ1ODJ | (183) 163-4723 | Reno | $25,227,451.85 | Hattie Schuster | |
| Cole, Tillman and Langworth | Y1JNB47Q | (289) 893-2488 | Dover | $13,838,171.56 | Jody Rohan | |
| Connelly, Cassin and Ledner | 69QI6R89 | (507) 196-5103 | Wilmington | $28,880,982.86 | Berneice Stracke | |
| Considine Inc | 1ZGMEMAV | (013) 094-8065 | Anchorage | $6,796,633.66 | Guido Hagenes | |
| Considine, Wilkinson and Spencer | HK18ZLOO | (772) 222-6147 | Jersey City | $8,490,647.93 | Douglas Prosacco | |
| Cormier - Hettinger | JFLKC0CK | (508) 849-8368 | Tucson | $14,771,052.63 | Nola Hand | |
| Cremin - Hodkiewicz | 4D30N08W | (757) 968-3487 | Fort Wayne | $27,239,848.21 | America Harber | |
| Cruickshank - Pollich | P3JT5LVY | (048) 698-7364 | Santa Fe | $32,195,480.36 | Joey Reilly | |
| Cruickshank, Auer and Schoen | TV06VSEA | (516) 585-5831 | Sioux Falls | $3,560,781.82 | Tiana Kiehn | |
| Cummerata Group | AJYD1N4I | (429) 577-7392 | Minneapolis | $20,579,317.84 | Gustave Zboncak | |
| Daniel LLC | ADF0WMN9 | (371) 118-7804 | Madison | $49,497,674.02 | Francisco Smitham | |
| Denesik, Skiles and Beier | 2ZMSATDW | (716) 332-8853 | Louisville | $25,958,417.48 | Dock Aufderhar | |
| Dibbert LLC | 4WT0EDV0 | (343) 448-8435 | Huntington | $24,379,660.89 | Elroy Leuschke | |
| Dickinson Inc | C7SI8E20 | (429) 201-5173 | Dover | $44,819,510.87 | Milton Ledner | |
| Dietrich and Sons | LAEDD52L | (189) 560-2423 | Hartford | $3,522,175.29 | Heath Kunde | |
| Donnelly - Sanford | 8SW26RNC | (738) 522-0182 | Fort Wayne | $37,819,037.93 | Betsy King | |
| Dooley - Nitzsche | NUCMFF7S | (574) 958-0441 | Charleston | $11,318,528.04 | Roman Dietrich | |
| Durgan and Sons | CKOSAHML | (332) 942-8325 | Saint Paul | $5,901,769.33 | Connor Marks | |
| Ebert - Wyman | HJBQWXIR | (753) 557-3136 | Los Angeles | $15,782,605.89 | Zetta Nolan |
ボタンは GET /api/permissions/operationsを尋ね、サインインユーザーだけが答えます:実行するすべての操作、またはあなたが名前を挙げた操作のみ、それぞれのリクエストが何を運ぶか、指し示すべきレコードを含みます。あなたのUIはBlazorの IOperationAccessCache や IPowerPortalsProService.GetOperationAccessForCurrentUserAsync 、Reactの useOperationAccess や ppp.retrieveOperationAccessAsync で同じ質問を行えます。