2017-01-27 7 views
0

私のプロジェクトの多くのデータベースを照会するには、.net c#MVCコントローラを使用しています。私が新しいコントローラを作成するたびに、新しいコントローラのために同じ機能を書き直す必要があることが分かりました。私はすべてのコントローラで使用する基本的なタスクを処理するための基本コントローラを作成することを考えました。クエリを実行し、jsonを実行します)。c#.netアクセス親obj

私のコントローラでは、このような基本コントローラを参照しています。 、私は、リクエストへのアクセス権を持っている

Request.ServerVariables["HTTP_REFERER"] and Request.ServerVariables["HTTP_HOST"].ToString().ToLower(); 

が、リクエストはこのコントローラでnullである:私のBasicController

namespace myWebAPI.Controllers 
{ 
    public class esrcController : Controller 
    { 
     // 
     // GET: /esrc/ 
     string db = "esrc-"; 
     basicController BasicController = new basicController(); 


     public string test() 
     { 
      return "test" + Request.ServerVariables["HTTP_REFERER"]; 
     } 
     public string getCodingException() 
     { 

      return @"{""data"":" + BasicController.getDataNconvertToJSON(
       "select * from z_codingexception order by nc_key", 
       BasicController.getEnviroment(db)) + "}"; 
     } 
    } 
} 

は、getEnviromentは、それゆえ私はへのアクセスを必要とする環境を決定するためのURLを見てメインコントローラ。どのように私は基本的なコントローラからhttpRequestを参照するのですか?

+0

の属性としてフィルタを追加するカスタムフィルタを作成しますか?なぜ標準の.NET命名規則に従っていないのですか? – mason

+0

基本クラスのコンストラクタパラメータにこのcontrollercontextを渡すこともできます。また、この設定の目的は何ですか? – Alok

+0

申し訳ありません、私はちょっと新しく、別のクラスではどういう意味ですか? – chungtinhlakho

答えて

3

コントローラの新しいインスタンスをインスタンス化するだけで、コンテキストにアクセスできるわけではありません。

1つのオプションは、他のすべてのコントローラーが継承する抽象基本コントローラーを作成することです。その後、Request

WebApiConfig.csなどの特定のオブジェクトにアクセスすることができます

config.MapHttpAttributeRoutes(); 

あなたのコントローラー

public abstract class MyBaseController : Controller 
{ 
protected void myMethod() 
{ 
    // you have access to Request here 
} 
} 

public class MyController : MyBaseController 
{ 
    [HttpGet] 
    [Route("my/getstuff")] 
    public IHttpActionResult GetStuff() 
    { 
     // do stuff 
     base.myMethod(); 
     return Ok(); 
    } 
} 
+0

MyBaseControllerをpublicに変更すると、ベースクラス 'MyBaseController'はクラス 'MyControllerController'よりアクセスが難しくなります。MyBaseControllerをpublicに変更すると、エラーは消えてしまいます。 http:// localhost:61792/My/GetStuff。ご協力いただきありがとうございます。 – chungtinhlakho

+0

Web APIを使用していると仮定すると、メソッドを呼び出すために適切なルーティングを設定する必要があります。更新された答えを参照してください –

+0

私はWeb APIのメソッドに入れた属性を参照してください –

-1

アクションフィルタを作成し、に属性として追加そのクラス。アクションフィルター内では、Requestオブジェクトにアクセスできます。 OnActionExecuting関数をオーバーライドすると、フィルターの機能がコントローラーの前に実行されます。

全く別のクラスに入れていないのはなぜ

public class CustomAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     //DO STUFF WITH YOUR REQUEST OBJECT HERE.. 
    } 
} 

があなたのコントローラ

[CustomAttribute] 
public class esrcController : Controller 
+0

この回答は尋ねられたことに対処していないようですが、アクションフィルタは非常に便利な機能ですが、ここにどのように適用されるのか分かりません。 –

+0

彼は何をしようとしているのかを知ることができます。すべてのコントローラで機能を実行し、 'Request'オブジェクトにアクセスできます。 –

+0

あなたに同意しないと申し訳ありません。これはフィルタの知識を披露しているようです。 –

関連する問題