web-dev-qa-db-ja.com

ASP .NET MVC NonActionの意味

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
}
35
Shaokan

NonAction属性は省略できますが、このメソッドはアクションメソッドとして呼び出し可能です。

MSDNサイトから( ref ):

デフォルトでは、MVCフレームワークはコントローラークラスのすべてのパブリックメソッドをアクションメソッドとして扱います。コントローラークラスにパブリックメソッドが含まれていて、それをアクションメソッドにしたくない場合は、そのメソッドをNonActionAttribute属性でマークする必要があります。

50
ReFocus

_[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
}
_
13
Taudris

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){
  }
}
5

[NonAction]属性を使用しない場合、誰かが「asd」関数を介さずにアクションを直接呼び出すことができます

5
devprog

NonAction属性は、ナビゲーションバーからアクションにアクセスできないようにします。たとえば、データベース内のアイテムを削除するアクションがある場合、NonAction属性を追加して、ユーザーがアクセスできないようにする必要があります。

2
Bilel Chaouadi

特定のエンドポイントの配信を延期するという最終決定があったため、Web APIで[NonAction]を使用して多数のコントローラーメソッド(エンドポイント)を装飾しました。

したがって、APIエンドポイントの公開を避けたいが、後で実装を維持したい場合に便利です。

そのため、この属性を使用して、時間を大幅に節約しました。

私は次のリリースでそれを削除するだけで、これは単にそこにあります!

2
cnom

これは、コントローラーメソッドがアクションメソッドではないことを示します。例:[NonAction] public void IndexTest(){// Do some thing}これは、コントローラーのメソッドの可視性をprivateに変更できない場合に非常に便利な属性です。

0
Ajeet Malviya

これは、パブリックアクセス修飾子によって定義されるメソッドで使用される属性です。実際、MVCフレームワークはすべてのパブリックメソッドをURLとして扱いますが、これが望ましくない場合は、アクション以外の属性でメソッドを修飾する必要があります。メソッドをプライベートにすることで同じことを実現できます。

NonAction属性の例を以下に示します。 http://yogeshdotnet.com/non-action-attribute-in-mvc/

0
Yogesh Sharma

まず、ActionResultを、MVCによって返される特定のタイプの構成体と考えてください。これは、たまたまMVCフレームワーク内でActionResultを内部的に処理できるという点で、特定の利便性を提供します。そのため、何かがActionResultであるという事実は必ずしも「this is public public available」を意味するわけではありません。実際、MVCコントローラーのすべてのパブリックメソッドは、ActionResultを返すかどうかに関係なく、アクションメソッドとして扱われます

そのため、ではないActionResultがnotではない戻り値の型を持っているだけで、必ずしもそのメソッドが公開されているとして公開されるのを防ぐことができますURL経由で呼び出すことができるアクション。

URLを介して呼び出すことができるアクションとしてメソッドを公開したくない多くの理由があり、これに対して「保護」したい場合は、[NonAction ']属性を使用します。

0
Chris Halcrow