ASP.NET MVC NonAction meaning

本文关键字:meaning NonAction MVC NET ASP | 更新日期: 2023-09-27 17:59:28

有人能告诉我为什么要使用NonAction属性吗?我的意思是说,我有一个表单有几个提交值:更新、删除或插入。由于所有的提交按钮都有相同的共同形式,我在控制器中切换提交值并相应地执行操作。

像这样:

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

再说一遍,为什么我应该使用NonAction而不是这样的东西:

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

ASP.NET MVC NonAction meaning

您可以省略NonAction属性,但该方法仍然可以作为操作方法调用。

来自MSDN站点(参考):

默认情况下,MVC框架将控制器类的所有公共方法视为操作方法。如果控制器类包含一个公共方法,并且不希望它是一个操作方法,则必须使用NonActionAttribute属性标记该方法。

值得注意的是,使用[NonAction]的需要仅适用于公共方法。受保护的方法和私有方法不被视为操作。由于您的Update/Delete/Insert方法是asd()的助手,因此专用方法更适合您的场景:

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

阅读哈克的文章

控制器类中的任何公共方法都可以通过URL调用。

有时你可能需要避免这种情况。例如,如果您实现了某个接口,并且可能不想调用该公共方法,则可以将其标记为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){
  }
}

我刚刚在我们的web api中使用了[NonAction]来装饰一堆控制器方法(端点),因为我们在最后一刻决定推迟特定端点的交付。

因此,如果您希望避免公开API端点,但仍希望保留实现以备将来使用,那么这是非常有用的。

所以我使用了这个属性,它为我节省了很多时间。

我只会在下一个版本中删除它,它就在那里!

如果你不使用[NonAction]属性,那么有人可以直接调用你的操作,而不必通过"asd"函数

NonAction属性使操作无法从导航栏访问。例如,若您有一个删除数据库中项目的操作,则必须添加NonAction属性以使用户无法访问它。

首先,将ActionResult简单地视为MVC返回的一种特定类型的构造,它恰好为ActionResult在MVC框架内的内部处理方式提供了特别的便利。因此,ActionResult并不一定意味着"这应该是公开的"。事实上,MVC控制器中的任何公共方法都将被视为操作方法,无论它是否返回ActionResult

因此,只要有一个不是ActionResult的返回类型,就不会必然会阻止该方法被公开为可以通过URL调用的公开操作。

您可能有很多原因不想将方法公开为可以通过url调用的操作,如果您想对此进行"保护",则需要使用[NonAction']属性。

这表示控制器方法不是操作方法。示例:[NonAction]public void IndexTest(){//Do something}当控制器的方法的可见性不能更改为private时,这是非常有用的属性。

如果您不想调用某些操作方法,那么您必须用属性[NonAction]或将其设为专用来标记它

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

您可以复制并粘贴代码,然后查看结果。谢谢