ASP .NET MVC NonAction含义

Sha*_*kan 36 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();
}
Run Code Online (Sandbox Code Playgroud)

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

public void Insert(){
    // some code inside here
}
Run Code Online (Sandbox Code Playgroud)

ReF*_*cus 50

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

从MSDN站点(参考):

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

  • 好吧,如果您在控制器类中创建了一个 public void,那么当您键入 url 时,页面将返回空白。因此,正如您(实际上是 MSDN :D)所述,所有公共方法都被视为操作结果。因此,除非您调用它,否则只要您不希望显示方法,就应该使用 NonActionAttribute :) 谢谢! (2认同)

Tau*_*ris 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
}
Run Code Online (Sandbox Code Playgroud)


cno*_*nom 9

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

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

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

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

  • 一般来说,注释掉代码并不是一个好的做法,但更多的情况是这样的:想象一下你为这个方法做了所有的实现和一些单元测试。这样您就不必将所有这些都注释掉! (4认同)
  • 只是想知道这比注释掉该方法有什么好处? (2认同)

dev*_*rog 5

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


Mur*_*san 5

阅读哈克的文章

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