ASP .NET MVC NonAction含义

任何人都可以告诉我为什么要使用NonAction? 我的意思是说我有一个包含多个提交值的表单:Update,Delete或Insert。 由于所有提交按钮具有相同的共同forms,因此我在控制器内切换提交值并采取相应措施。

像这样:

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 } 

您可以省略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 } 

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

阅读哈克的文章

控制器类中的任何公共方法都可以通过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属性使得无法从导航栏访问操作。 例如,如果您有一个删除数据库中项目的操作,则必须添加NonAction属性以使用户无法访问它。

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

因此,简单地使用不是 ActionResult的返回类型不一定会阻止该方法作为可通过URL调用的公共可用操作公开。

可能有很多原因导致您不希望将方法公开为可以通过url调用的操作,并且在您要“保护”此操作的情况下,即使用[NonAction’]属性时。

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

它是一个属性,用于由公共访问修饰符定义的方法。 实际上,MVC框架将所有公共方法视为URL,但是如果您不想这样做,则必须使用non action属性修饰方法。 通过将该方法设为私有可以实现相同的目的。

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

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

 public ActionResult Index(){ return View(); } [NonAction] public ActionResult Countries(Listcountries){ return View(countries); } 

你可以复制代码并粘贴它,看看结果。谢谢