0

インターネットをサーフィンしようとしましたが、欲しいものに関連するものは何も得られませんでした。

これは ASP.Net に関連しています。しかし、他のインスタンスでもかまいません。

以下は私の属性です

class  SomeAttribute :Attribute
{
    string someparam;
    string SomeParam
    {
         get{ return someparam;}
         set { someparam = val;}
         //the value generated for someparam is dynamically generated with respect to some attribute present in the request header.
    }
 }

これは、ユーザーがログインしているかどうかを検証するために .net が asp .net メンバーシップで使用する [Authorize] 属性に似ており、検証が失敗した場合はユーザーをログイン ページにリダイレクトします。

以下のようなメソッドに関連付けられた属性があります。

   [SomeAttribute] 
     public void someFunction
    {
      //i want to retrieve here the value of someparam jus generated before entering this method.
     }

この属性では、値を渡したり、名前付きプロパティを使用したりしていないことに注意してください。メソッドが呼び出されるたびに条件をチェックし、true または false を返し、それに応じて関数が呼び出されるかどうかを判断します。

私の場合、検証後、値が生成され、その値は「somefunction」に関連付けられている関数と共有する必要があります。

リフレクションは、関数に関連付けられた属性とそのプロパティの値を取得するのに役立つことを知っています。

しかし、ここでは、他の関数から値をフェッチしたくありません。また、属性をフェッチするだけでも構いません。

前に述べたように、関数が呼び出されると、属性はその上で機能します。この属性が行うことは、リクエスト ヘッダーからデータを取得し、何らかの処理を行って値を生成することです。この値は、その直後に関数に渡す必要があります。

4

1 に答える 1

1

達成したいことは確かに可能ですが、ランタイムや MVC モデルを最適に使用することはできません。

この特定のケースでは、属性を注釈と考えてください。関数やコントローラーなどをマークして、実行時の動作が異なるようにするために使用するものです。属性自体が作業の大部分を行うべきではなく、デザイン内の他の部分に別の動作をするよう信号を送るだけです。

いくつかのヘッダー値を確認し、それに基づいて何かを計算したいようです。Request クラスの拡張メソッドを使用して、これを実現できます。

ここで、コントローラーの関数内で、ヘッダー値が存在することを保証したいとしましょう。IActionFilter を実装するRequireHeaderValuesという属性を持つことができます。この属性はヘッダーで必要な値をチェックし、それらが存在しない場合は、応答を別の場所にルーティングするか、何らかの形でエラーを示します。このようにして、関数内で Request オブジェクトから拡張メソッドを呼び出すと、値が存在することが保証されます。MVC ランタイムは、フィルター属性を自動的に呼び出します。詳細については、こちらを参照してください。

于 2013-08-07T05:33:40.297 に答える