ASP .NET MVC NonAction含义

时间:2011-06-17 12:15:59

标签: c# asp.net-mvc actionmethod

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

像这样:

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
}

10 个答案:

答案 0 :(得分:48)

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

从MSDN网站(ref):

  

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

答案 1 :(得分:13)

值得注意的是,使用[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
}

答案 2 :(得分:5)

如果您不使用[NonAction]属性,则有人可以直接调用您的操作,而不必通过'asd'功能

答案 3 :(得分:5)

Reading Haack's Article

  

控制器类中的任何公共方法都可以通过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){
  }
}

答案 4 :(得分:2)

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

答案 5 :(得分:2)

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

因此,如果您希望避免暴露API端点,但仍希望稍后继续实施,那么它很有用。

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

我将在下一个版本中将其删除,这只会在那里!

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

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

因此,只是让不是的返回类型必然会阻止该方法作为可以通过URL。

您可能有很多理由不希望将某个方法公开为可以通过网址调用的操作,如果您想要“保护”此方法,那么当您使用[NonAction]时]属性。

答案 8 :(得分:0)

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

答案 9 :(得分:-1)

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

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

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

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