我正在开发一个分为年度会话的系统。用户可以去改变会话以查看过去的会话
我如何将用户当前yearId
传递给每个控制器?
我在想我可以在身份验证上设置用户cookie,或者当他们手动更改会话并使用全局过滤器检查cookie时
public class MyTestAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpCookie cookie = filterContext.HttpContext.Request.Cookies["myCookie"];
//do something with cookie.Value
if (cookie!=null)
{
filterContext.ActionParameters["YearId"] = cookie.Value;
}
else
{
// do something here
}
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
}
}
以下是我如何使用上述过滤器:(或将其添加为全局过滤器)
[MyTestAttribute]
public ActionResult Index(int yearId)
{
//Pass the yearId down the layers
// _repo.GetData(yearId);
return View();
}
使用这种方法,我必须将yearId添加到每个控制器。任何反馈都表示赞赏。
答案 0 :(得分:1)
您还可以为需要参数而不是过滤器的控制器创建基类:
public class MyBaseController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpCookie cookie = filterContext.HttpContext.Request.Cookies["myCookie"];
//do something with cookie.Value
if (cookie!=null)
{
filterContext.ActionParameters["YearId"] = cookie.Value;
}
else
{
// do something here
}
}
}
或者您甚至可以创建一个强类型属性并使其变得懒惰,这样您就不必将它作为参数包含在每个操作方法中,除非您访问该属性,否则不执行评估:
public class MyBaseController : Controller
{
private int? _yearId;
protected int YearId
{
get
{
// Only evaluate the first time the property is called
if (!_yearId.HasValue)
{
// HttpContext is accessible directly off of Controller
HttpCookie cookie = HttpContext.Request.Cookies["myCookie"];
//do something with cookie.Value
if (cookie!=null)
{
_yearId = int.Parse(cookie.Value);
}
else
{
// do something here
}
}
return _yearId.Value;
}
}
}
答案 1 :(得分:0)
这太过分了。
为什么不把值放在会话中?如果他们更改“会话”以查看过去的会话,只需修改会话中的变量。