El RecordContext componente envuelve un único registro de Dataverse y lo proporciona como un valor en cascada a todos los componentes descendientes como editores, cuadrículas y resúmenes de validación. Hereda de MainContext, por lo que soporta todas las mismas funciones de guardado, actualización, validación y seguimiento de estados sucios.
Hay varias formas de especificar qué registro debe cargar:RecordContext
Record — Pasa un TableRecord objeto directamente. Útil cuando ya tienes el registro en memoria o estás creando uno nuevo.{/* Sin 'id' = modo de creación: comienza con un registro en memoria,
emite una CreateRequest en la partida. */}
<RecordContext table="contact">
<TextEdit columnName="firstname" />
<TextEdit columnName="lastname" />
</RecordContext><RecordContext Record="@(new TableRecord { TableName = "contact" })">
<TextEdit ColumnName="firstname" />
<TextEdit ColumnName="lastname" />
</RecordContext>QueryParameterName y TableName — El contexto lee el ID del registro de un parámetro de consulta URL y recupera automáticamente el registro de Dataverse. Si no hay identificación, se crea un nuevo registro.{/* URL: /my-page?id=00000000-0000-0000-0000-00000-0000000001 */}
<RecordContext table="contact" queryParameterName="id">
<TextEdit columnName="firstname" />
<TextEdit columnName="lastname" />
</RecordContext><!-- URL: /my-page?id=00000000-0000-0000-0000-00000-0000000001 -->
<RecordContext TableName="contact" QueryParameterName="id">
<TextEdit ColumnName="firstname" />
<TextEdit ColumnName="lastname" />
</RecordContext>RecordId y TableName — Especificar el ID del registro directamente como parámetro en lugar de leerlo desde la URL.<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>Utiliza la RecordLoaded callback para ejecutar la lógica después de que el registro haya sido recuperado de Dataverse. Esto es útil para inicializar estados dependientes o cargar datos relacionados.
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)
{
// Inicializar datos relacionados con el estado dependiente o la carga
}
}En lugar de usar ChildContent, puedes usar el ContextTemplate parámetro para acceder directamente al TableRecord objeto en tu marcado mediante una variable plantilla.
{/* React no tiene <ContextTemplate> equivalente — render a un hijo</ContextTemplate>
que lee el registro cargado mediante el gancho 'useRecordContext'. */}
function ContactHeader() {
const { record } = useRecordContext();
return <h2>Edición: {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>Edición: @context["firstname"]</h2>
<TextEdit ColumnName="firstname" />
<TextEdit ColumnName="lastname" />
</ContextTemplate>
</RecordContext>Llama DeleteAsync() para eliminar el registro actual. Se le solicita al usuario un diálogo de confirmación antes de ejecutar la eliminación. Usa la OnBeforeDelete callback para ejecutar lógica personalizada o cancela la eliminación configurando CancelEventArgs.Cancel en true.
function MyPage() {
const onBeforeDelete = async () => {
// Lanzar para cancelar la eliminación:
// lanzar un nuevo error ('Borrar cancelado');
};
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)
{
// Opcionalmente, cancela la eliminación
// eventArgs.Cancel = true;
}
}Al usar QueryParameterName, monitoriza RecordContext automáticamente los cambios de URL. Si el valor del parámetro de consulta cambia mientras permanece en la misma página, el contexto recarga el nuevo registro sin una navegación completa de la página. Tras guardar un registro recién creado, la URL se actualiza para incluir el ID del nuevo registro.
El siguiente ejemplo muestra un sencillo RecordContext que muestra el texto del registro actual.
Nombre | Tipo | Default | Descripción |
|---|---|---|---|
ChildContent | RenderFragment? | Los componentes hijos representados dentro de este contexto. | |
ContextTemplate | RenderFragment<TableRecord> | Opcionalmente puedes especificar una plantilla para el registro. Esto te permite acceder al objeto 'TableRecord' en la plantilla. | |
DisableUnsavedChangesWarning | bool? | Cuando se configura en true, el cuadro de advertencia de cambios no guardados no se muestra al alejarse de la página. La advertencia siempre aparece al actualizar, independientemente de esta configuración. Si no se establece explícitamente, el valor se hereda del contexto padre. | |
ForceSuccessfulValidationBeforeSave | bool | True | ¿Debería realizarse una validación exitosa del registro antes de permitir que se guarde? |
IsDirty | bool | False | Indica si el registro o cualquier contexto hijo registrado tiene cambios no guardados. |
ParentContext | MainContext? | El antepasado más cercano, MainContext, que permite jerarquías de contexto anidado. | |
QueryParameterName | string? | El nombre del parámetro de consulta que especifica el id del registro a recuperar. | |
Record | TableRecord? | El registro enlazaba con este contexto de registro. | |
RecordId | string? | El GUID específico del registro para el contexto. | |
TableName | string? | El nombre lógico de la tabla del registro. |
ChildContentContextTemplateDisableUnsavedChangesWarningForceSuccessfulValidationBeforeSaveIsDirtyParentContextQueryParameterNameRecordRecordIdTableNameNombre | Tipo | Descripción |
|---|---|---|
OnBeforeDelete | EventCallback<CancelEventArgs> | Llamada de regreso antes de borrar. Permite cancelar la operación de borrado. |
OnBeforeSave | EventCallback<CancelEventArgs> | Llamó la llamada antes de guardar. Permite cancelar la operación de guardado. |
RecordLoaded | EventCallback<TableRecord> | EventCallback para activarse cuando se carga el registro. |
OnBeforeDeleteOnBeforeSaveRecordLoadedNombre | Parámetros | Tipo | Descripción |
|---|---|---|---|
DeleteAsync | Task<bool> | Solicita confirmación y luego elimina el registro actual. | |
GetRequests | List<OrganizationRequest> | Devuelve la solicitud de creación o actualización del registro si está sucio, además de las solicitudes desde contextos hijos. | |
RefreshAsync | bool forceRefresh | Task | Recarga el registro desde el servidor, solicitando opcionalmente sobre los cambios no guardados. |
ResetState | void | Reinicia el registro y todos los contextos hijos a su último estado guardado. | |
SaveAsync | bool? refresh | Task<bool> | Guarda el registro y navega hasta la URL del registro si fue creado recientemente. |
Validate | bool | Valida el registro y cualquier subcontexto (cuadrícula, edición de búsqueda, registro, principal). |
DeleteAsyncGetRequestsRefreshAsyncResetStateSaveAsyncValidate