Quando você usaria o atributo ChildActionOnly
? O que é ChildAction
e em que circunstância você deseja restringir uma ação usando esse atributo?
fonte
Quando você usaria o atributo ChildActionOnly
? O que é ChildAction
e em que circunstância você deseja restringir uma ação usando esse atributo?
O ChildActionOnly
atributo garante que um método de ação possa ser chamado apenas como método filho de dentro de uma visualização. Um método de ação não precisa ter esse atributo para ser usado como uma ação filho, mas tendemos a usá-lo para impedir que os métodos de ação sejam chamados como resultado de uma solicitação do usuário. Tendo definido um método de ação, precisamos criar o que será renderizado quando a ação for invocada. As ações filho geralmente estão associadas a visualizações parciais, embora isso não seja obrigatório.
[ChildActionOnly] permitindo acesso restrito via código no modo de exibição
Implementação de informações de estado para URL da página específica. Exemplo: a sintaxe do URL da página de pagamento (pagando apenas uma vez) permite chamar ações específicas condicionais
// example from Music Store // GET: /ShoppingCart/CartSummary [ChildActionOnly] public ActionResult CartSummary() { // your stuff } /ShoppingCart/CartSummary will return "The action 'CartSummary' is accessible only by a child request."
Portanto, você evita um GET para um determinado controlador diretamente, mas apenas de outro controlador / ação. Provável: _Vistas parciais.InvalidOperationException
quando um método marcado<ChildActionOnly>
é chamado pelo navegador?Com o atributo [ChildActionOnly] anotado, um método de ação pode ser chamado apenas como método filho de uma exibição. Aqui está um exemplo para [ChildActionOnly]. .
existem dois métodos de ação: Index () e MyDateTime () e as Visualizações correspondentes: Index.cshtml e MyDateTime.cshtml. este é o HomeController.cs
Aqui está a visão para Index.cshtml .
Aqui está a exibição parcial MyDateTime.cshtml .
Isso significa que você não pode chamar diretamente a vista parcial. mas pode ser chamado pela visualização Index () como no Index.cshtml
fonte
NonAction
também, que diferença isso faz?Você usaria se estiver usando
RenderAction
em qualquer uma das suas visualizações, geralmente para renderizar uma visualização parcial.O motivo para marcá-lo
[ChildActionOnly]
é que você precisa que o método controller seja público para poder chamá-lo,RenderAction
mas não deseja que alguém possa navegar para um URL (por exemplo, / Controller / SomeChildAction) e ver os resultados desse ação diretamente.fonte
RenderAction
qualquer umNonActionAttribute
em projetos reais?private
ouprotected
. Eu realmente não posso pensar em nenhuma boa razão por que você iria querer fazer um método de controlepublic
, exceto se você queria tanto ser capaz de chamá-lo diretamente ou viaRenderAction
FYI, [ChildActionOnly] não está disponível no ASP.NET MVC Core. veja algumas informações aqui
fonte
Um pouco tarde para a festa, mas ...
As outras respostas explicam bem qual o efeito do
[ChildActionOnly]
atributo. No entanto, na maioria dos exemplos, fiquei me perguntando por que criaria um novo método de ação apenas para renderizar uma exibição parcial, dentro de outra, quando você poderia simplesmente renderizar@Html.Partial("_MyParialView")
diretamente na exibição. Parecia uma camada desnecessária. No entanto, como investiguei, descobri que um benefício é que a ação filho pode criar um modelo diferente e transmiti-lo à visão parcial. O modelo necessário para a parcial pode não estar disponível no modelo da vista na qual a vista parcial está sendo renderizada. Em vez de modificar a estrutura do modelo para obter os objetos / propriedades necessários apenas para renderizar a vista parcial, você pode chamar a ação filho e solicitar que o método de ação crie o modelo necessário para a vista parcial.Isso pode ser útil, por exemplo, em
_Layout.cshtml
. Se você tiver algumas propriedades comuns a todas as páginas, uma maneira de conseguir isso é usar um modelo de vista base e ter todos os outros modelos de vista herdados dele. Em seguida, é_Layout
possível usar o modelo de vista base e as propriedades comuns. A desvantagem (que é subjetiva) é que todos os modelos de exibição devem herdar do modelo de exibição base para garantir que essas propriedades comuns estejam sempre disponíveis. A alternativa é renderizar@Html.Action
nesses lugares comuns. O método de ação criaria um modelo separado necessário para a visualização parcial comum a todas as páginas, o que não impactaria o modelo para a visualização "principal". Nesta alternativa, a_Layout
página não precisa ter um modelo. Daqui resulta que todos os outros modelos de vista não precisam herdar de nenhum modelo de vista base.Tenho certeza de que existem outros motivos para usar o
[ChildActionOnly]
atributo, mas isso me parece bom, então pensei em compartilhar.fonte
fonte