42

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
}
4

10 に答える 10

58

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

MSDNサイト(ref)から:

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

于 2011-06-17T12:19:08.470 に答える
15

[NonAction]使用する必要があるのは public メソッドのみであることに注意してください。保護されたプライベート メソッドはアクションとして扱われません。//メソッドは のヘルパーであるためUpdate、シナリオにはプライベート メソッドの方が適していますDeleteInsertasd()

public ActionResult asd(string submitButton){
    switch(submitButton){
        case "Insert":
            return Insert();
        // bla bla bla
    }
}

ActionResult Insert(){
    // some code inside here
}
于 2012-09-22T00:29:56.410 に答える
5

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

于 2011-06-17T12:19:37.007 に答える
5

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){
  }
}
于 2013-09-27T15:42:31.683 に答える
0

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

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

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

于 2017-06-02T05:32:04.017 に答える