42

谁能告诉我为什么要使用该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
}
4

10 回答 10

58

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

从 MSDN 网站(参考):

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

于 2011-06-17T12:19:08.470 回答
15

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

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

ActionResult Insert(){
    // some code inside here
}
于 2012-09-22T00:29:56.410 回答
5

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

于 2011-06-17T12:19:37.007 回答
5

阅读 Haack 的文章

控制器类中的任何公共方法都可以通过 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){
  }
}
于 2013-09-27T15:42:31.683 回答
5

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

因此,如果您想避免暴露 API 端点,但仍想保留实现以供以后使用,那么它很有用。

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

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

于 2017-11-16T13:54:04.657 回答
3

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

于 2014-08-04T18:48:49.953 回答
1

它是用于由公共访问修饰符定义的方法的属性。实际上,MVC 框架将所有公共方法视为 URL,但如果您不希望这样做,则必须使用非操作属性装饰方法。通过将方法设为私有也可以实现同样的目的。

下面给出了 NonAction 属性的示例。 http://yogeshdotnet.com/non-action-attribute-in-mvc/

于 2017-02-14T15:22:07.167 回答
0

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

因此,仅仅拥有一个不是ActionResult的返回类型不一定会阻止该方法公开为可通过 URL 调用的公开可用操作。

您不想将方法公开为可以通过 url 调用的操作可能有很多原因,如果您想“保护”免受这种情况的影响,那就是使用 [NonAction'] 属性的时候。

于 2017-06-02T05:32:04.017 回答
0

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

于 2017-10-30T06:17:22.803 回答
-1

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

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

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

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

于 2017-06-21T18:45:50.893 回答