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
}
您可以省略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);
}
您可以复制并粘贴代码,然后查看结果。谢谢