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 并在基础上添加一个 getter 可能会更安全,它将读出存储在那里的值。

于 2013-02-05T02:57:53.957 回答