Significado de ASP .NET MVC NonAction
-
29-10-2019 - |
Pregunta
¿Alguien puede decirme por qué debería utilizar NonAction?Quiero decir, 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.
Como 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 utilizar NonAction en lugar de algo como esto?
public void Insert(){
// some code inside here
}
Solución
Puede omitir el atributo NonAction
, pero el método aún se puede invocar 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.
Otros consejos
Vale la pena señalar que la necesidad de utilizar [NonAction]
Se aplica sólo a métodos públicos.Los métodos protegidos y privados no se tratan como acciones.desde tu Update
/Delete
/Insert
Los métodos 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
}
Si no usa el atributo [NonAction], alguien puede llamar a su acción directamente en lugar de tener que pasar por la función 'asd'
Cualquier método público en una clase de controlador se puede llamar a través de una URL.
A veces, es posible que deba evitar esto.Por ejemplo, si implementa alguna interfaz y es posible que no desee llamar a ese método público, puede 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){
}
}
Acabo de usar [NonAction] en nuestra api web, para decorar un montón de métodos de controlador (puntos finales) porque tuvimos una decisión de último minuto de posponer 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.
Entonces usé 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 ActionResult simplemente como un tipo particular de construcción que devuelve MVC, que proporciona una conveniencia particular en términos de la forma en que ActionResult se puede manejar internamente dentro del marco MVC.Entonces, el hecho de que algo sea un ActionResult no significa necesariamente " 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, devuelva o no un ActionResult .
Entonces, simplemente tener un tipo de retorno que no es un ActionResult no evitará necesariamente que ese método se exponga como una acción disponible públicamente que se puede llamar a través de unURL.
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 desee 'protegerse' contra esto, es cuando usa la opción [NonAction '] atributo.
Esto se indica que un método de controlador no es un método de acción. Ejemplo: [NonAtion] Void público indextest () {// Hacer algo} Este es un atributo muy útil cuando la visibilidad del método del controlador no se puede cambiar a privado..
Es un atributo que se usa en los métodos definidos por modificadores de acceso público.En realidad, MVC Framework trata todos los métodos públicos como URL, pero en caso de que no desee esto, debe decorar un método con el atributo de no acción.Se puede lograr lo mismo haciendo que el método sea privado.
A continuación se proporciona un ejemplo de atributo de no acción. http://yogeshdotnet.com/non-action-attribute-in-mvc/
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