RecordContextコンポーネントは単一のDataverseレコードをラップし、エディタ、グリッド、検証要約などすべての子孫コンポーネントにカスケード的な値として提供します。MainContextから継承しているため、保存、リフレッシュ、検証、汚れた状態追跡機能はすべてサポートしています。
どのレコードを RecordContext ロードすべきかを指定する方法はいくつかあります:
Record — TableRecord 物を直接渡す。すでにレコードをメモリに持っている場合や新しいレコードを作成する際に便利です。{/* no 'id' = create mode:インメモリレコードで始まります。
セーブ時にCreateRequestを発します。 */}
<RecordContext table="contact">
<TextEdit columnName="firstname" />
<TextEdit columnName="lastname" />
</RecordContext><RecordContext Record="@(new TableRecord { TableName = "contact" })">
<TextEdit ColumnName="firstname" />
<TextEdit ColumnName="lastname" />
</RecordContext>QueryParameterName および TableName — コンテキストはURLクエリパラメータからレコードIDを読み取り、Dataverseから自動的にレコードを取得します。IDがなければ新しい記録が作成されます。{/* URL: /my-page?id=0000000-0000-0000-0000-00000000001 */}
<RecordContext table="contact" queryParameterName="id">
<TextEdit columnName="firstname" />
<TextEdit columnName="lastname" />
</RecordContext><!-- URL: /my-page?id=0000000-0000-0000-0000-00000000001 -->
<RecordContext TableName="contact" QueryParameterName="id">
<TextEdit ColumnName="firstname" />
<TextEdit ColumnName="lastname" />
</RecordContext>RecordId および TableName — URLからレコードIDを読み取るのではなく、直接パラメータとして指定すること。<RecordContext table="contact" id="00000000-0000-0000-0000-000000000001">
<TextEdit columnName="firstname" />
</RecordContext><RecordContext TableName="contact" RecordId="00000000-0000-0000-0000-000000000001">
<TextEdit ColumnName="firstname" />
</RecordContext>Dataverseからレコードを取得した後、 RecordLoaded コールバックを使ってロジックを実行します。これは依存状態の初期化や関連データの読み込みに役立ちます。
function MyPage() {
const onRecordLoaded = (record: TableRecord) => {
// Initialize dependent state or load related data
};
return (
<RecordContext
table="contact"
queryParameterName="id"
onRecordLoaded={onRecordLoaded}
>
<TextEdit columnName="firstname" />
</RecordContext>
);
}<RecordContext TableName="contact"
QueryParameterName="id"
RecordLoaded="OnRecordLoaded">
<TextEdit ColumnName="firstname" />
</RecordContext>
@code {
private async Task OnRecordLoaded(TableRecord record)
{
// 依存状態や関連データの初期化
}
}ChildContentを使う代わりに、ContextTemplateパラメータを使ってテンプレート変数を通じてマークアップ内のTableRecordオブジェクトに直接アクセスできます。
{/* Reactには <ContextTemplate> 対応するものがありません — 子を生成する</ContextTemplate>
'useRecordContext' フックを通じて読み込まれたレコードを読み込むコンポーネントです。 */}
function ContactHeader() {
const { record } = useRecordContext();
return <h2>編集: {String(record?.['firstname']?.value ?? '')}</h2>;
}
<RecordContext table="contact" queryParameterName="id">
<ContactHeader />
<TextEdit columnName="firstname" />
<TextEdit columnName="lastname" />
</RecordContext><RecordContext TableName="contact" QueryParameterName="id">
<ContextTemplate>
<h2>編集: @context["firstname"]</h2>
<TextEdit ColumnName="firstname" />
<TextEdit ColumnName="lastname" />
</ContextTemplate>
</RecordContext>DeleteAsync()に電話して現在の記録を削除してください。削除が実行される前に、確認ダイアログが表示されます。OnBeforeDeleteコールバックを使ってカスタムロジックを実行したり、CancelEventArgs.Cancelをtrueに設定して削除をキャンセルしてください。
function MyPage() {
const onBeforeDelete = async () => {
// 削除をキャンセルするにはスロー:
// 新しいエラー('キャンセル削除」)を投げます。
};
return (
<RecordContext
table="contact"
queryParameterName="id"
onBeforeDelete={onBeforeDelete}
>
<MenuBar>
<DeleteContextButton />
</MenuBar>
<TextEdit columnName="firstname" />
</RecordContext>
);
}<RecordContext TableName="contact"
QueryParameterName="id"
OnBeforeDelete="OnBeforeDelete">
<MenuBar>
<DeleteContextButton />
</MenuBar>
<TextEdit ColumnName="firstname" />
</RecordContext>
@code {
private async Task OnBeforeDelete(CancelEventArgs eventArgs)
{
// 削除をキャンセルすることも可能です
// eventArgs.Cancel = true;
}
}QueryParameterNameを使うと、RecordContextは自動的にURLの変更を監視します。同じページに留まったままクエリパラメータの値が変わると、コンテキストはページ全体のナビゲーションなしに新しいレコードを再読み込みます。新たに作成されたレコードを保存した後、URLに新しいレコードのIDが更新されます。
以下の例は、現在のレコードのテキストを表示する簡単な RecordContext を示しています。
名称 | 種類 | デフォルト | 概要 |
|---|---|---|---|
ChildContent | RenderFragment? | この文脈でレンダリングされる子コンポーネント。 | |
ContextTemplate | RenderFragment<TableRecord> | 必要に応じて、記録用のテンプレートを指定することもできます。これによりテンプレート内の「TableRecord」オブジェクトにアクセスできます。 | |
DisableUnsavedChangesWarning | bool? | trueに設定すると、ページから離れる際に未保存の変更警告ダイアログが表示されません。 この設定に関係なく、リフレッシュ時に常に警告が表示されます。 明示的に設定されていない場合、その値は親コンテキストから継承されます。 | |
ForceSuccessfulValidationBeforeSave | bool | True | 記録の検証が成功してから保存を許可した場合、 |
IsDirty | bool | False | レコードや登録済みの子コンテキストに保存されていない変更があるかどうかを示します。 |
ParentContext | MainContext? | 最も近い祖先であるMainContextにより、ネストされたコンテキスト階層が可能になりました。 | |
QueryParameterName | string? | 取得すべきレコードのIDを指定するクエリパラメータの名前。 | |
Record | TableRecord? | この記録はこの記録の文脈にリンクされています。 | |
RecordId | string? | コンテキストのためにレコードの具体的なGUIDを使います。 | |
TableName | string? | レコードの論理名。 |
ChildContentContextTemplateDisableUnsavedChangesWarningForceSuccessfulValidationBeforeSaveIsDirtyParentContextQueryParameterNameRecordRecordIdTableName名称 | 種類 | 概要 |
|---|---|---|
OnBeforeDelete | EventCallback<CancelEventArgs> | コールバックから連絡があり、その後削除されました。削除操作のキャンセルを可能にします。 |
OnBeforeSave | EventCallback<CancelEventArgs> | コールバックから電話がかかってきて、セーブ前に電話がかかってきた。セーブ操作をキャンセルすることが可能です。 |
RecordLoaded | EventCallback<TableRecord> | レコードが読み込まれたときにトリガーされるEventCallback。 |
OnBeforeDeleteOnBeforeSaveRecordLoaded名称 | パラメータ | 種類 | 概要 |
|---|---|---|---|
DeleteAsync | Task<bool> | 確認を求めるプロンプトが出た後、現在の記録が削除されます。 | |
GetRequests | List<OrganizationRequest> | レコードが汚れている場合は作成または更新リクエストを返し、子コンテキストからのリクエストも返します。 | |
RefreshAsync | bool forceRefresh | Task | サーバーからレコードを再読み込み、未保存の変更についてのプロンプトもオプションで表示します。 |
ResetState | void | レコードとすべての子コンテキストを最後に保存した状態にリセットします。 | |
SaveAsync | bool? refresh | Task<bool> | レコードを保存し、新しく作成されたレコードURLにナビゲートします。 |
Validate | bool | レコードとサブコンテキスト(グリッド、ルックアップ編集、レコード、メイン)を検証します。 |
DeleteAsyncGetRequestsRefreshAsyncResetStateSaveAsyncValidate