Botões de Operação

Um botão de operação executa uma operação registrada pelo servidor — uma API personalizada, uma ação personalizada, uma mensagem própria do Dataverse ou código seu — e aparece apenas para os usuários para os quais está registrado. O botão pergunta ao servidor uma vez quais operações o usuário logado pode executar, e verifica cada registro que enviaria em relação ao que o usuário pode fazer com ele, para não oferecer o que o servidor recusaria. O servidor ainda julga cada solicitação quando ela é enviada.

Registrando uma operação

Registre uma operação no servidor Program.cs: AddOperationAccess para uma operação do Dataverse, AddOperationHandler para seu próprio código. Dentro AddPortalRolede , WithOperationAccess e WithOperationHandler conceda uma aos detentores do papel. Um registro indica quem pode executar a operação, os parâmetros que uma solicitação pode carregar, os registros para os quais devem apontar e as saídas que retornam.

  • ForEveryone(), ForSignedInUsers(), ForContactsMatching(fetchXml) e ForWebRoles(...) digam quem pode executá-la; o registro de uma função é para os detentores da função. Sob a segurança nativa do Dataverse, os contatos possuem papéis web em vez de portais, e uma API personalizada é oferecida apenas a usuários cujos papéis de segurança concedem seu privilégio de execução.
  • Uma solicitação pelo seu próprio código é julgada exatamente como a de uma operação do Dataverse: o manipulador vê apenas as requisições que foram passadas, com os parâmetros definidos pelo servidor preenchidos, e o chamador vê apenas as saídas retornadas pelo registro.
  • Seu próprio código não pode compartilhar a transação do Dataverse, então um pedido é enviado por conta própria: um lote que carrega com qualquer outra coisa é recusado.
  • Segurança descreve tudo o que um registro pode dizer.

OperationButton

Coloque onde OperationButton a operação pertence, nomeando a operação e o parâmetro em que seu registro vai entrar.

React Blazor
  • Ela é oculta dos usuários que podem não executar a operação e, enquanto a resposta está a caminho; configure WhenNotAllowed (whenNotAllowed) para desativá-la em vez disso. A resposta é pedida uma vez e mantida enquanto o aplicativo está aberto; uma solicitação que o servidor recusa pede novamente.
  • O registro entra RecordParameterem : Record, qualquer registro por referência, ou então o registro do RecordContext botão fica lá, uma vez salvo. O usuário deve poder agir conforme o registro exige: o registro de um formulário diz o que o usuário pode fazer com ele, e um registro nomeado por referência é lido para ele.
  • Em um formulário, uma operação do Dataverse no registro do formulário é enviada no save próprio do formulário, após as alterações, então ambos são salvos ou nenhum, e o registro é lido novamente. Seu próprio código roda após as alterações do formulário serem salvas.
  • Parameters são enviadas com cada requisição, e GetParametersAsync (getParameters) acumula mais quando o botão é clicado, por exemplo; não devolver nada cancela o clique. ConfirmationMessage pergunta antes da operação rodar e OnCompleted devolve suas saídas.
  • Defina seu texto com Label ou seu conteúdo, e seu ícone, dica de ferramenta e aparência como em qualquer outro botão.

Exemplo

A demo registra algumas linhas de seu próprio código como uma operação para todos. Digite um nome e clique no botão: o servidor responde, e a página diz a saudação.

Exemplo de reação Exemplo de Blazor React TypeScript Razor
Diga olá

OperationGridButton

Na barra de ferramentas de uma grade, OperationGridButton executa a operação uma vez para cada linha selecionada, enviando a linha em RecordParameter, e então atualiza a grade. Ela é ativada enquanto cada linha selecionada é uma que o usuário pode agir, que cada linha diz por si só. As requisições de uma operação do Dataverse são enviadas em uma única transação, então todas são executadas ou nenhuma roda; seu próprio código roda em uma linha de cada vez e para na primeira que falha.

React Blazor

Exemplo: em cada linha selecionada

Selecione algumas contas e clique em Verificar: o próprio código da demo lê cada uma e responde seu nome. Aprovar é concedido apenas para um papel de portal que nenhum visitante possui, então aparece como desativado.

Exemplo de reação Exemplo de Blazor React TypeScript Razor
Todas as Contas
Sortem
Todas as Contas
Tamanho da página 102050100
Sortem
Nome da Conta
Nome da Conta
Digite o nome da empresa ou do negócio.
Número da Conta
Número da Conta
Digite um número de ID ou código para a conta para pesquisar e identificar rapidamente a conta nas visualizações do sistema.
Telefone Principal
Telefone Principal
Digite o número principal dessa conta.
Endereço 1: Cidade
Endereço 1: Cidade
Digite a cidade como endereço principal.
Receita Anual
Receita Anual
Digite a receita anual da conta, usada como indicador na análise de desempenho financeiro.
Contato Primário
Contato Primário
Escolha o contato principal da conta para fornecer acesso rápido aos dados de contato.
Abernathy - MacGyverKTWSLQHY(491) 600-8029Tampa$15.959.059,84Bradford Kiehn
Abshire - Marks4EBO9F42(432) 879-3107Boston$14.635.260,82Archibald Bailey
Adams - TorphyK6VNNUCN(864) 842-2566Annapolis$4.567.299,55Merle Vandervort
Altenwerth, D'Amore and ManteF9MN5BAZ(125) 048-0015Gulfport$3.839.082,81Heidi Reichel
Ankunding and Sons92P2G0SF(603) 147-5429Fargo$32.724.448,89Fatima White
Balistreri, Heller and Murphy3Y0AF481(909) 808-9886New Haven$7.097.756,35Angie Kreiger
Balistreri, Steuber and SchultzFF5RCGXG(435) 761-0052Hattiesburg$35.943.517,75Jake Bogisich
Bartoletti LLCJBQ0L2O8(292) 573-7498Santa Fe$766.813,66Cecil Sipes
Bartoletti, Ratke and BeattyWZIDG7K2(267) 075-5978Portland$32.338.459,84Tabitha Morissette
Barton, Koepp and CroninTGAL5Y8F(821) 885-8434Norman$43.550.293,98Marc Dibbert
Bashirian - HamillZS1XZLDL(792) 135-0145Baltimore$15.916.182,51Alexie Dach
Bashirian - WeberOC5PYOJC(492) 789-5504Cranston$23.269.960,31Emmet Krajcik
Baumbach and SonsX8V8TZRX(670) 937-4364Ann Arbor$4.319.879,33Charity Sawayn
Baumbach, Maggio and TurnerV24ZA492(509) 251-9848Orlando$25.479.745,81Cali McClure
Beahan IncB9XXSIJM(262) 429-4179Sioux Falls$45.854.197,84Tressa Graham
Berge and SonsWO8OIGR6(165) 108-8947Topeka$40.560.550,52Delphine Jerde
Bergnaum GroupT3KB03RE(381) 148-7032Rapid City$32.406.150,23Dakota Ward
Bergstrom and SonsG99XNRDY(182) 902-0206Casper$48.880.601,83Grant Funk
Bergstrom, Bins and FlatleyJ1TXPJ9I(409) 160-0657Pittsburgh$21.005.421,54Blanche Gulgowski
Blanda - Terry4L8RSVL9(190) 468-0033Vancouver$33.567.160,56Fausto Pagac
Bode LLCF5IR66HK(386) 496-6921Detroit$1.800.033,15Kane Pollich
Bogisich, Mitchell and BalistreriPCVDL8PS(267) 567-6606Manchester$10.336.491,66Esperanza Luettgen
Borer - MohrLHI1SSVO(070) 539-8404Providence$36.092.236,14Emelia Murray
Botsford - Baumbach8JZK18K6(389) 188-6100Cranston$318.662,34Maria Runte
Botsford, Schroeder and KassulkeU39NNCOJ(960) 101-3753Sacramento$19.016.940,28Raphael Bergnaum
Boyer - SchaeferEFJQXML0(473) 115-3249Fort Wayne$48.601.111,30Moses Metz
Boyle, Zulauf and LakinXXRF6GXU(028) 071-4090Helena$31.856.728,91Federico Hamill
Brekke LLCUCLPTB19(795) 385-0349Norman$25.296.518,98Noemie Stracke
Brekke, Feeney and JohnsVMGNL1M7(203) 861-9656Charleston$13.632.447,58Kristin Koch
Brown, Rohan and MayerEMOSYGOI(479) 235-6497Fairbanks$49.780.735,02Phoebe Legros
Cassin, Kassulke and Schaefer5KSSVNW7(852) 978-3789Flagstaff$29.260.487,45Dedrick Thiel
Christiansen - MetzGSZJ1ODJ(183) 163-4723Reno$25.227.451,85Hattie Schuster
Cole, Tillman and LangworthY1JNB47Q(289) 893-2488Dover$13.838.171,56Jody Rohan
Connelly, Cassin and Ledner69QI6R89(507) 196-5103Wilmington$28.880.982,86Berneice Stracke
Considine Inc1ZGMEMAV(013) 094-8065Anchorage$6.796.633,66Guido Hagenes
Considine, Wilkinson and SpencerHK18ZLOO(772) 222-6147Jersey City$8.490.647,93Douglas Prosacco
Cormier - HettingerJFLKC0CK(508) 849-8368Tucson$14.771.052,63Nola Hand
Cremin - Hodkiewicz4D30N08W(757) 968-3487Fort Wayne$27.239.848,21America Harber
Cruickshank - PollichP3JT5LVY(048) 698-7364Santa Fe$32.195.480,36Joey Reilly
Cruickshank, Auer and SchoenTV06VSEA(516) 585-5831Sioux Falls$3.560.781,82Tiana Kiehn
Cummerata GroupAJYD1N4I(429) 577-7392Minneapolis$20.579.317,84Gustave Zboncak
Daniel LLCADF0WMN9(371) 118-7804Madison$49.497.674,02Francisco Smitham
Denesik, Skiles and Beier2ZMSATDW(716) 332-8853Louisville$25.958.417,48Dock Aufderhar
Dibbert LLC4WT0EDV0(343) 448-8435Huntington$24.379.660,89Elroy Leuschke
Dickinson IncC7SI8E20(429) 201-5173Dover$44.819.510,87Milton Ledner
Dietrich and SonsLAEDD52L(189) 560-2423Hartford$3.522.175,29Heath Kunde
Donnelly - Sanford8SW26RNC(738) 522-0182Fort Wayne$37.819.037,93Betsy King
Dooley - NitzscheNUCMFF7S(574) 958-0441Charleston$11.318.528,04Roman Dietrich
Durgan and SonsCKOSAHML(332) 942-8325Saint Paul$5.901.769,33Connor Marks
Ebert - WymanHJBQWXIR(753) 557-3136Los Angeles$15.782.605,89Zetta Nolan

Perguntando o que o usuário pode rodar

Os botões perguntam GET /api/permissions/operations, o que responde apenas para o usuário logado: cada operação que ele pode executar, ou apenas aquelas que você nomeia, com o que uma solicitação para cada uma pode conter e os registros para os quais deve apontar. Sua própria interface pode pedir o mesmo através IOperationAccessCache ou IPowerPortalsProService.GetOperationAccessForCurrentUserAsync no Blazor, e useOperationAccess /ou ppp.retrieveOperationAccessAsync no React.

React Blazor

OperationButton Classe

Parâmetros

Nome
Tipo
Padrão
Descrição
AppearanceButtonAppearance?
Como fica o botão.
BusyMessagestring?
O que a sobreposição diz enquanto a operação roda; um 'Funcionando...' geral quando não está definido.
ChildContentRenderFragment?
O conteúdo do botão, no lugar de OperationButtonBase.Label.
ConfirmationMessagestring?
Uma pergunta que o usuário responde antes da operação — 'Emitir reembolso por esta fatura?' — Ou null para rodar imediatamente.
ContextRecordContext?
O contexto do registro cujo registro o botão envia. Não é necessário se o botão estiver colocado dentro de um Components.RecordContext.
Disabledbool
False
Desativa o botão, seja qual for o uso do usuário.
GetParametersAsyncFunc<Task<IReadOnlyDictionary<string, ColumnValueBase>>>?
Coleta parâmetros quando o botão é clicado — por exemplo, de um diálogo, — adicionado a OperationButtonBase.Parameters. Retorno null cancela o clique. Eles são conhecidos apenas uma vez clicado, então se o usuário pode executar a operação é julgado antes disso sem eles, e O garçom julga o pedido com eles.
IconIcon?
Um ícone mostrado antes do texto.
Labelstring?
O texto do botão.
Operation*string
O nome da operação, conforme registrada.
ParametersIReadOnlyDictionary<string, ColumnValueBase>?
Os parâmetros enviados com cada solicitação, pelo nome. Um parâmetro de registro é um Models.LookupValue; o registro que ele nomeia deve ser um que o usuário possa atuar, pois o O registro da operação exige, ou o botão conta como não permitido.
RecordTableRecordReference?
O registro enviado em OperationButtonBase.RecordParameter, por referência. Quando não está definido, o registro do Components.RecordContext botão está (ou OperationButton.Context) é enviado, uma vez salvo.
RecordParameterstring?
O parâmetro em que o registro é enviado — Alvo, digamos: um OperationButton's OperationButton.Record ou registro de forma, cada linha selecionada de um OperationGridButton.
RefreshRecordbool
True
Se o registro do formulário é lido novamente uma vez que uma operação é executada sozinha — o código do host — tem rodar nele, pois pode ter mudado. Ativado por padrão. Uma operação do Dataverse que usa o formulário O save é lido de volta junto com o save, como no React.
Tooltipstring?
Mostrado quando o ponteiro repousa no botão.
WhenNotAllowedOperationButtonBehavior
Hide
O que o botão faz quando o usuário pode não executar a operação. Oculto por padrão.
Nome: Appearance
Tipo: ButtonAppearance?
Descrição: Como fica o botão.
Nome: BusyMessage
Tipo: string?
Descrição: O que a sobreposição diz enquanto a operação roda; um 'Funcionando...' geral quando não está definido.
Nome: ChildContent
Tipo: RenderFragment?
Descrição: O conteúdo do botão, no lugar de OperationButtonBase.Label.
Nome: ConfirmationMessage
Tipo: string?
Descrição: Uma pergunta que o usuário responde antes da operação — 'Emitir reembolso por esta fatura?' — Ou null para rodar imediatamente.
Nome: Context
Tipo: RecordContext?
Descrição: O contexto do registro cujo registro o botão envia. Não é necessário se o botão estiver colocado dentro de um Components.RecordContext.
Nome: Disabled
Tipo: bool
Padrão: False
Descrição: Desativa o botão, seja qual for o uso do usuário.
Nome: GetParametersAsync
Tipo: Func<Task<IReadOnlyDictionary<string, ColumnValueBase>>>?
Descrição: Coleta parâmetros quando o botão é clicado — por exemplo, de um diálogo, — adicionado a OperationButtonBase.Parameters. Retorno null cancela o clique. Eles são conhecidos apenas uma vez clicado, então se o usuário pode executar a operação é julgado antes disso sem eles, e O garçom julga o pedido com eles.
Nome: Icon
Tipo: Icon?
Descrição: Um ícone mostrado antes do texto.
Nome: Label
Tipo: string?
Descrição: O texto do botão.
Nome: Operation*
Tipo: string
Descrição: O nome da operação, conforme registrada.
Nome: Parameters
Tipo: IReadOnlyDictionary<string, ColumnValueBase>?
Descrição: Os parâmetros enviados com cada solicitação, pelo nome. Um parâmetro de registro é um Models.LookupValue; o registro que ele nomeia deve ser um que o usuário possa atuar, pois o O registro da operação exige, ou o botão conta como não permitido.
Nome: Record
Tipo: TableRecordReference?
Descrição: O registro enviado em OperationButtonBase.RecordParameter, por referência. Quando não está definido, o registro do Components.RecordContext botão está (ou OperationButton.Context) é enviado, uma vez salvo.
Nome: RecordParameter
Tipo: string?
Descrição: O parâmetro em que o registro é enviado — Alvo, digamos: um OperationButton's OperationButton.Record ou registro de forma, cada linha selecionada de um OperationGridButton.
Nome: RefreshRecord
Tipo: bool
Padrão: True
Descrição: Se o registro do formulário é lido novamente uma vez que uma operação é executada sozinha — o código do host — tem rodar nele, pois pode ter mudado. Ativado por padrão. Uma operação do Dataverse que usa o formulário O save é lido de volta junto com o save, como no React.
Nome: Tooltip
Tipo: string?
Descrição: Mostrado quando o ponteiro repousa no botão.
Nome: WhenNotAllowed
Tipo: OperationButtonBehavior
Padrão: Hide
Descrição: O que o botão faz quando o usuário pode não executar a operação. Oculto por padrão.

Eventos

Nome
Tipo
Descrição
OnCompletedEventCallback<OperationCompletedEventArgs>
Levantado assim que a operação terminou, com o que respondeu.
OnErrorEventCallback<Exception>
Levantado quando a operação falha, no lugar do diálogo de erro o botão aparece de outra forma.
Nome: OnCompleted
Tipo: EventCallback<OperationCompletedEventArgs>
Descrição: Levantado assim que a operação terminou, com o que respondeu.
Nome: OnError
Tipo: EventCallback<Exception>
Descrição: Levantado quando a operação falha, no lugar do diálogo de erro o botão aparece de outra forma.
React Blazor

OperationGridButton Classe

Parâmetros

Nome
Tipo
Padrão
Descrição
AppearanceButtonAppearance?
Como fica o botão.
BusyMessagestring?
O que a sobreposição diz enquanto a operação roda; um 'Funcionando...' geral quando não está definido.
ConfirmationMessagestring?
Uma pergunta que o usuário responde antes da operação — 'Emitir reembolso por esta fatura?' — Ou null para rodar imediatamente.
Disabledbool
False
Desativa o botão, seja qual for o uso do usuário.
GetParametersAsyncFunc<Task<IReadOnlyDictionary<string, ColumnValueBase>>>?
Coleta parâmetros quando o botão é clicado — por exemplo, de um diálogo, — adicionado a OperationButtonBase.Parameters. Retorno null cancela o clique. Eles são conhecidos apenas uma vez clicado, então se o usuário pode executar a operação é julgado antes disso sem eles, e O garçom julga o pedido com eles.
IconIcon?
Um ícone mostrado antes do texto.
Labelstring?
O texto do botão.
Operation*string
O nome da operação, conforme registrada.
ParametersIReadOnlyDictionary<string, ColumnValueBase>?
Os parâmetros enviados com cada solicitação, pelo nome. Um parâmetro de registro é um Models.LookupValue; o registro que ele nomeia deve ser um que o usuário possa atuar, pois o O registro da operação exige, ou o botão conta como não permitido.
RecordParameterstring?
O parâmetro em que o registro é enviado — Alvo, digamos: um OperationButton's OperationButton.Record ou registro de forma, cada linha selecionada de um OperationGridButton.
Tooltipstring?
Mostrado quando o ponteiro repousa no botão.
VisibilityBehaviorGridButtonBehavior?
Quando o botão é mostrado, pela seleção. Com um parâmetro de registro, para uma ou mais selecionadas brigas; sem, sempre.
WhenNotAllowedOperationButtonBehavior
Hide
O que o botão faz quando o usuário pode não executar a operação. Oculto por padrão.
Nome: Appearance
Tipo: ButtonAppearance?
Descrição: Como fica o botão.
Nome: BusyMessage
Tipo: string?
Descrição: O que a sobreposição diz enquanto a operação roda; um 'Funcionando...' geral quando não está definido.
Nome: ConfirmationMessage
Tipo: string?
Descrição: Uma pergunta que o usuário responde antes da operação — 'Emitir reembolso por esta fatura?' — Ou null para rodar imediatamente.
Nome: Disabled
Tipo: bool
Padrão: False
Descrição: Desativa o botão, seja qual for o uso do usuário.
Nome: GetParametersAsync
Tipo: Func<Task<IReadOnlyDictionary<string, ColumnValueBase>>>?
Descrição: Coleta parâmetros quando o botão é clicado — por exemplo, de um diálogo, — adicionado a OperationButtonBase.Parameters. Retorno null cancela o clique. Eles são conhecidos apenas uma vez clicado, então se o usuário pode executar a operação é julgado antes disso sem eles, e O garçom julga o pedido com eles.
Nome: Icon
Tipo: Icon?
Descrição: Um ícone mostrado antes do texto.
Nome: Label
Tipo: string?
Descrição: O texto do botão.
Nome: Operation*
Tipo: string
Descrição: O nome da operação, conforme registrada.
Nome: Parameters
Tipo: IReadOnlyDictionary<string, ColumnValueBase>?
Descrição: Os parâmetros enviados com cada solicitação, pelo nome. Um parâmetro de registro é um Models.LookupValue; o registro que ele nomeia deve ser um que o usuário possa atuar, pois o O registro da operação exige, ou o botão conta como não permitido.
Nome: RecordParameter
Tipo: string?
Descrição: O parâmetro em que o registro é enviado — Alvo, digamos: um OperationButton's OperationButton.Record ou registro de forma, cada linha selecionada de um OperationGridButton.
Nome: Tooltip
Tipo: string?
Descrição: Mostrado quando o ponteiro repousa no botão.
Nome: VisibilityBehavior
Tipo: GridButtonBehavior?
Descrição: Quando o botão é mostrado, pela seleção. Com um parâmetro de registro, para uma ou mais selecionadas brigas; sem, sempre.
Nome: WhenNotAllowed
Tipo: OperationButtonBehavior
Padrão: Hide
Descrição: O que o botão faz quando o usuário pode não executar a operação. Oculto por padrão.

Eventos

Nome
Tipo
Descrição
OnCompletedEventCallback<OperationCompletedEventArgs>
Levantado assim que a operação terminou, com o que respondeu.
OnErrorEventCallback<Exception>
Levantado quando a operação falha, no lugar do diálogo de erro o botão aparece de outra forma.
Nome: OnCompleted
Tipo: EventCallback<OperationCompletedEventArgs>
Descrição: Levantado assim que a operação terminou, com o que respondeu.
Nome: OnError
Tipo: EventCallback<Exception>
Descrição: Levantado quando a operação falha, no lugar do diálogo de erro o botão aparece de outra forma.