Pergunta

Alguém pode me dizer por que devo usar o NonAction?Quero dizer, digamos que tenho um formulário com vários valores de envio:Atualizar, excluir ou inserir.Como todos os botões de envio têm o mesmo formato em comum, estou trocando o valor de envio dentro do controlador e ajo de acordo.

Assim:

public ActionResult asd(string submitButton){
     switch(submitButton){
         case "Insert":
             return Insert();
         // bla bla bla
     }
}

[NonAction]
public ActionResult Insert(){
    // some code inside here
    return View();
}

Mais uma vez, por que devo usar NonAction em vez de algo assim:

public void Insert(){
    // some code inside here
}

Outras dicas

É importante notar que a necessidade de usar [NonAction] se aplica apenas a métodos públicos.Os métodos protegidos e privados não são tratados como ações.Como seus métodos Update / Delete / Insert são auxiliares para asd(), um método privado seria mais apropriado para o seu cenário:

public ActionResult asd(string submitButton){
    switch(submitButton){
        case "Insert":
            return Insert();
        // bla bla bla
    }
}

ActionResult Insert(){
    // some code inside here
}

Se você não usar o atributo [NonAction], alguém pode chamar sua ação diretamente, em vez de passar pela função 'asd'

Lendo o artigo de Haack

Qualquer método público em uma classe de controlador pode ser chamado via URL.

Às vezes, você pode precisar evitar isso.Por exemplo, se você implementar alguma interface e não quiser chamar esse método público, pode marcar como NonAction

public interface IEmployee
{
 void Save(Employee e);
 bool Validate(Employee e);
}

public class EmployeeController:Controller, IEmployee
{
  public void Save(Employee e){
  }

  [NonAction]
  public void Validate(Employee e){
  }
}

Acabei de usar [NonAction] em nossa API da web para decorar vários métodos de controlador (endpoints) porque tomamos uma decisão de última hora que adiaríamos a entrega dos endpoints específicos.

Portanto, é útil se você deseja evitar a exposição de um endpoint de API, mas ainda deseja manter a implementação para mais tarde.

Então, usei esse atributo e me economizou muito tempo.

Vou apenas removê-lo na próxima versão e ele simplesmente estará lá!

O atributo NonAction torna uma ação não acessível a partir da barra de navegação.Por exemplo, se você tiver uma ação que exclui itens do banco de dados, deverá adicionar o atributo NonAction para torná-lo inacessível aos usuários.

Em primeiro lugar, pense em um ActionResult simplesmente como um tipo particular de construção que é retornado pelo MVC, que por acaso fornece uma conveniência particular em termos de como o ActionResult pode ser tratado internamente dentro do framework MVC.Portanto, o fato de algo ser um ActionResult não significa necessariamente " isso deve estar disponível publicamente ".Na verdade, qualquer método público em um controlador MVC será tratado como um método de ação, retorne ou não um ActionResult .

Portanto, simplesmente ter um tipo de retorno que não é um ActionResult não necessariamente impedirá que o método seja exposto como uma ação publicamente disponível que pode ser chamada por meio de umURL.

Pode haver muitos motivos pelos quais você não deseja expor um método como uma ação que pode ser chamada por meio de um url e, no caso de você desejar se 'proteger' contra isso, é quando você usa a função [NonAction '] atributo.

Isso indica que um método do controlador não é um método de ação. Exemplo: [NonAction] public void IndexTest () {// Faça alguma coisa} este é um atributo muito útil quando a visibilidade do método do controlador não pode ser alterada para privada.

É um atributo que é usado nos métodos definidos por modificadores de acesso público.Na verdade, o MVC Framework trata todos os métodos públicos como URLs, mas caso você não queira isso, então você deve decorar um método com o atributo non action.A mesma coisa pode ser alcançada tornando o método privado.

Um exemplo de Atributo NonAction é fornecido abaixo. http://yogeshdotnet.com/non-action-attribute-in-mvc/

Se você não quiser invocar alguns métodos de ação, você deverá marcá-los com um atributo [NonAction] ou tornando-o privado

public ActionResult Index(){
    return View();
}

[NonAction]
public ActionResult Countries(List<string>countries){
    return View(countries);
}

você pode copiar o código e colá-lo e ver o resultado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top