在我的控制器上,我继承了 MainController ,并在那里覆盖了Initialize
和OnActionExecuting
。
在这里,我看到了什么是URL,我可以查看客户端是什么,但我了解到,对于每个调用的方法,这会一次又一次地被激发,即使是简单的{{ 1}}将触发同一个控制器的初始化。
有没有更好的技术来避免重复数据库调用?我正在使用实体框架,所以它将花费时间来调用数据库,因为它已经在缓存中产生了结果,但是......只是想知道是否有更好的技术< / strong>现在在MVC3中而不是在会话变量
中托管变量示例代码
redirectToAction
仍然最好这样做:
public class MyController : MainController
{
public ActionResult Index()
{
return View();
}
}
public class MainController : Controller
{
public OS_Clients currentClient { get; set; }
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
// get URL Info
string url = requestContext.HttpContext.Request.Url.AbsoluteUri;
string action = requestContext.RouteData.GetRequiredString("action");
string controller = requestContext.RouteData.GetRequiredString("controller");
object _clientUrl = requestContext.RouteData.Values["cliurl"];
if (_clientUrl != null && _clientUrl.ToString() != "none")
{
// Fill up variables
this.currrentClient = db.FindClientById(_clientUrl.ToString());
}
base.Initialize(requestContext);
}
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
// based on client and other variables, redirect to Disable or Login Actions
// ... more code here like:
// filterContext.Result = RedirectToAction("Login", "My");
base.OnActionExecuting(filterContext);
}
}
答案 0 :(得分:2)
在这种情况下,您似乎要处理应用程序安全性,我建议创建Authorization
过滤器,该过滤器很早就会进入操作。您可以将权限检查代码放在那里,如果权限不符合AuthorizeCore
,框架将自动将用户重定向到登录页面。
接下来,如果用户有权限,您可以使用HttpContext.Items
作为请求级别缓存。然后你可以创建另一个ActionFilter
并执行动作,或者你可以使用基本控制器从Httpcontext.items中获取用户并将其分配给控制器属性。
如果您使用的是asp.net mvc 3,那么您可以使用GlobalFilters
注册上述过滤器,而不是装饰每个控制器。
希望有所帮助。
答案 1 :(得分:0)
在基本控制器中,您需要将第一个调用的结果缓存在Session变量中。
这确保不会不必要地调用后端(DB),并且数据绑定到用户的Session而不是跨用户共享,就像应用程序缓存一样。