1

私のビューに隠された入力があるとします。ここで、これを含むリクエストに基づいて、コントローラーベースのパブリックプロパティにこれを非表示にしたいと考えています。

これはできますか?

最終結果は、一致する名前付きアイテムを含むすべてのリクエストに対して設定されたベース コントローラーのプロパティになります。

public class ControllerBase
{
   public bool Debug{ get; set; }
}

public class MyController : ControllerBase
{
   public ActionResult Action1()
   {
      return View(base.Debug ? "in debug mode" : "not in debug mode");
   }
}

可能と思われる別のことは、コンストラクター注入を使用した同じアイデアです。

基本的に私が言っていると思いますが、コントローラーが呼び出される前に、リクエストで利用可能なデータが DI コンテナーを微調整して、その情報の一部をセットアップするステップはありますか?

4

1 に答える 1

2

おそらく比較的簡単な方法は、ActionFilter を作成して ControllerBase に適用することです。DebugModeAttribute にしたとしましょう。

public class DebugModeAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.RequestContext.HttpContext.Request.Form["hidden_var"] == "true")
        {
            var controller = filterContext.Controller as ControllerBase;
            if (controller != null)
                controller.Debug = true;
        }
    }
}

それは仕事を成し遂げるはずですが、それは最もきれいな解決策ではないかもしれません. ただし、ソリューションに関係なく、DI コンテナーが要求ごとに新しいインスタンスを作成しない場合は注意が必要です。HttpContext.Items を変更し、そこに格納されている値を読み取るベースにゲッターを追加する方が安全かもしれません。

于 2013-02-05T02:57:53.957 に答える