说我的观点有隐藏的输入。现在我希望隐藏的内容可以根据包含它的任何请求填充到我的控制器的公共属性中。
我可以这样做吗?
最终结果将是我的基本控制器上的一个属性,该属性是为包含匹配命名项的任何请求填充的。
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容器,以便在调用控制器之前为您设置一些信息吗?
答案 0 :(得分: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。