net mvc asp c# asp.net-mvc actionmethod

c# - ASP.NET MVC Significado de no acción



model binder mvc c# (10)

¿Alguien puede decirme por qué debo usar NonAction? Quiero decir que tengo un formulario con varios valores de envío: Actualizar, Eliminar o Insertar. Dado que todos los botones de envío tienen la misma forma en común, estoy cambiando el valor de envío dentro del controlador y actúo en consecuencia.

Me gusta esto:

public ActionResult asd(string submitButton){ switch(submitButton){ case "Insert": return Insert(); // bla bla bla } } [NonAction] public ActionResult Insert(){ // some code inside here return View(); }

Una vez más, ¿por qué debería usar NonAction en lugar de algo como esto?

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


Acabo de usar [No Acción] en nuestra API web, para decorar un montón de Métodos de Control (puntos finales) porque tuvimos una decisión de último minuto de que pospondremos la entrega de los puntos finales específicos.

Por lo tanto, es útil, si desea evitar exponer un punto final de API, pero aún desea mantener la implementación para más adelante.

Así que utilicé este atributo y me ahorró mucho tiempo.

¡Lo eliminaré en la próxima versión y esto simplemente estará allí!


El atributo NonAction hace que una acción no sea accesible desde la barra de navegación. Por ejemplo, si tiene una acción que elimina elementos en la base de datos, debe agregar el atributo NonAction para que los usuarios no puedan acceder a él.


En primer lugar, piense en un ActionResult simplemente como un tipo particular de construcción devuelta por MVC, que brinda una conveniencia particular en términos de la forma en que ActionResult puede manejarse internamente dentro del marco de MVC. Entonces, el hecho de que algo sea un ActionResult no significa necesariamente que " esto debería estar disponible públicamente ". De hecho, cualquier método público en un controlador MVC será tratado como un método de acción, ya sea que devuelva o no un ActionResult .

Por lo tanto, el simple hecho de tener un tipo de retorno que no sea un ActionResult no necesariamente evitará que el método se exponga como una acción disponible públicamente a la que se puede llamar a través de una URL.

Puede haber muchas razones por las que no desea exponer un método como una acción que se puede invocar a través de una url, y en el caso de que quiera "protegerse" contra esto, es cuando se usa el atributo [No acción].


Es un atributo que se usa en los métodos definidos por los modificadores de acceso público. En realidad, MVC Framework trata a todos los métodos públicos como URL, pero en caso de que no quiera esto, entonces tiene que decorar un método con el atributo de no acción. Lo mismo se puede lograr haciendo el método privado.

A continuación se muestra un ejemplo de atributo de no acción. http://yogeshdotnet.com/non-action-attribute-in-mvc/


Esto indica que un método de controlador no es un método de acción. Ejemplo: [NonAction] public void IndexTest () {// Hacer algo} este atributo es muy útil cuando la visibilidad del método del controlador no se puede cambiar a privado.


Puede omitir el atributo NonAction pero el método aún es invocable como método de acción.

Desde el sitio de MSDN ( ref ):

De forma predeterminada, el marco MVC trata todos los métodos públicos de una clase de controlador como métodos de acción. Si su clase de controlador contiene un método público y no desea que sea un método de acción, debe marcar ese método con el atributo NonActionAttribute.


Si no desea invocar algunos métodos de acción, debe marcarlo con un atributo [NonAction] o hacerlo privado.

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

puedes copiar el código y pegarlo y ver el resultado. gracias


Si no usa el atributo [No acción], entonces alguien puede llamar a su acción directamente en lugar de tener que pasar por la función ''asd''


Vale la pena señalar que la necesidad de utilizar [NonAction] aplica solo a los métodos públicos. Los métodos protegidos y privados no son tratados como acciones. Ya que sus métodos de Update / Delete / Insert son ayudantes para asd() , un método privado sería más apropiado para su escenario:

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


Leyendo el artículo de Haack

Cualquier método público en una clase de controlador se puede llamar a través de URL.

A veces es posible que necesite evitar esto. Por ejemplo, si implementa alguna interfaz y es posible que no desee llamar a ese método público, puede marcarlo como No de 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){ } }